[译]C# 7系列,Part 3: Default Literals
原文:
c#的default关键字有两种用法:一种是标记switch…case结构的默认分支(会匹配任意不被所有case条件匹配的路径);另一种方法是表示类型的“默认”值。我将在本文中讨论这个用法。
一个类型的默认值:
- 如果类型是引用类型,则为空
- 如果类型是值类型,则使用这个值类型的无参数构造函数构造出来的实例。
下面的截图是一个简单的例子。
但是,你不能对任何开放类型使用默认表达式(注意:开放类型是具有未绑定类型参数的类型;一个拥有所有的绑定类型参数的类型被称为封闭类型),例如:
现在,如果我们想在一个方法中使用泛型类型的默认值,我们必须写类似这样的代码:
public static void method(immutablearray<int> array) { } public static void main(string[] args) { method(default(immutablearray<int>)); }
你看到上面代码的冗余了吗?编译器应该知道method()所需的第一个参数的确切类型。所以一个不需要具体类型的关键字default应该足够了。
默认文本表达式
c# 7.1允许default表达式。如果使用c#语言版本7.1或更新版本进行编译,您可以将代码简化如下:
public static void method(immutablearray<int> array) { } public static void main(string[] args) { method(default); }
现在你的代码简洁了!
类似地,你可以在default(…)表达式可以出现的所有地方使用默认文本表达式:
public static void main(string[] args = default) { // 可选参数的默认值 int i = default; // 类型 system.int32 的默认值 0 string s = default; // 类型 system.string 的默认值 null method(default); // 使用参数的默认值调用一个方法 t t = default; // 类型参数的默认值 return default; // 一个有返回值的方法返回默认值 }
你还能够在判断条件中使用默认文本表达式
int x = 2; if (x == default) { } // 判断x是否是类型 system.int32 的默认值 0 if (x is default) { } // 同上
更有趣的是,您可以在switch…case语句中使用默认文本表达式。哦,太酷了!等一下,要是我输入"case default"标签呢?下面这张图是我在vs中输入case default的截图:
如果你使用vs的建议来修改你的语句,就会变成下面这样:
int x = 2; switch (x) { case (default): break; //译注:vs建议使用case 0 或者 case null来代替。 default: break; }
这看起来很让人困惑,但至少我们得到了关于这个的实时分析,感谢roslyn!(译注:c#编译器)
我想说的最后一件事是,有些情况下不能应用默认文本表达式,例如:
// 错误: 'as' 必须用在引用类型 default as int; // ok. 但是左边的表达式总是null。 if (default as string == string.empty) { } // 错误,不能对default关键字使用操作符is。 if (default is string) { }
结论
c# 7.1中的默认文本表达式避免了编译器知道默认值时的冗余输入。这是语法上的改进,clr没有任何变化,新代码与c#编译器早期版本构建的代码100%兼容。
系列文章:
上一篇: 【并发编程】实现多线程的几种方式
推荐阅读
-
[译]C# 7系列,Part 8: in Parameters in参数
-
[译]C# 7系列,Part 3: Default Literals
-
[译]C# 7系列,Part 7: ref Returns ref返回结果
-
[译]C# 7系列,Part 9: ref structs ref结构
-
[译]C# 7系列,Part 4: Discards
-
[译]C# 7系列,Part 2: Async Main
-
[译]C# 7系列,Part 5: private protected 访问修饰符
-
[译]C# 7系列,Part 6: Read-only structs 只读结构
-
[译]C# 7系列,Part 1: Value Tuples
-
[译]C# 7系列,Part 10: Span
and universal memory management Span 和统一内存管理