is 模式表达式
is 模式表达式扩展了常用 is 运算符,使其可查询其类型之外的对象。它可以在检查类型过程中编写变量初始化。
object obj = "value";
if (obj is string tmp) {
Console.WriteLine($"obj is a string, value is {tmp}");
}
这部分的意思是,如果 obj 是 string 类型的实例,则分配临时变量 tmp 来保存转换为 string 之后的值。
switch 模式表达式
看代码即可,具体意义同 is 模式表达式:
public static int DiceSum4(IEnumerable<object> values) {
var sum = 0;
foreach (var item in values) {
switch (item) {
case 0:
break;
case int val:
sum += val;
break;
case IEnumerable<object> subList when subList.Any():
sum += DiceSum4(subList);
break;
case IEnumerable<object> subList:
break;
case null:
break;
default:
throw new InvalidOperationException("unknown item type");
}
}
return sum;
}
本地函数
使用场景:当某一函数 A 需要通过另一个函数 B 来进行更加复杂的处理,但其他地方都不会用到 B,此时,我们可以将 B 声明在 A 的内部,示例如下:
public static IEnumerable<char> AlphabetSubset3(char start, char end) {
if (start < 'a' || start > 'z')
throw new ArgumentOutOfRangeException(paramName: nameof(start), message: "start must be a letter");
if (end < 'a' || end > 'z')
throw new ArgumentOutOfRangeException(paramName: nameof(end), message: "end must be a letter");
if (end <= start)
throw new ArgumentException($"{nameof(end)} must be greater than {nameof(start)}");
return alphabetSubsetImplementation();
IEnumerable<char> alphabetSubsetImplementation() {
for (var c = start; c < end; c++)
yield return c;
}
}
本地方法仅在外部方法的上下文中引用。本地函数的规则还确保开发人员不会意外地从类中的另一个位置调用本地函数和绕过参数验证。
二进制表示和数字分隔符
在创建位掩码时,或每当数字的二进制表示形式使代码最具可读性时, 可使用二进制进行表示,常量开头的 0b 表示该数字以二进制数形式写入。示例如下:
public const int One = 0b0001;
public const int Two = 0b0010;
public const int Four = 0b0100;
public const int Eight = 0b1000;
如果二进制很长,可通过 _ 作为数字分隔符通常更易于查看,如下:
public const int Sixteen = 0b0001_0000;
public const int ThirtyTwo = 0b0010_0000;
public const int SixtyFour = 0b0100_0000;
public const int OneHundredTwentyEight = 0b1000_0000;
数字分隔符可以出现在常量的任何位置:
// 对于十进制数字,通常将其用作千位分隔符
public const long BillionsAndBillions = 100_000_000_000;
// 数字分隔符也可以与 decimal、float 和 double 类型一起使用
public const double AvogadroConstant = 6.022_140_857_747_474e23;
public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M;
这样,可读性就很强了。 |