原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-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 = ;
if (x == default) { } // 判断x是否是类型 System.Int32 的默认值 0
if (x is default) { } // 同上

更有趣的是,您可以在switch…case语句中使用默认文本表达式。哦,太酷了!等一下,要是我输入"case default"标签呢?下面这张图是我在VS中输入case default的截图:

如果你使用VS的建议来修改你的语句,就会变成下面这样:

int x = ;
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 3: Default Literals 默认文本表达式的更多相关文章

  1. [译]C# 7系列,Part 9: ref structs ref结构

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了 ...

  2. [译]C# 7系列,Part 8: in Parameters in参数

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数 ...

  3. [译]C# 7系列,Part 1: Value Tuples 值元组

    Mark Zhou写了很不错的一系列介绍C# 7的文章,虽然是2年多年前发布的,不过对于不熟悉C# 7特性的同学来说,仍然有很高的阅读价值. 原文:https://blogs.msdn.microso ...

  4. [译]C# 7系列,Part 2: Async Main 异步Main方法

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...

  5. [译]C# 7系列,Part 4: Discards 弃元

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/27/c-7-series-part-4-discards/ 有时我们想要忽略一个方法返回的值,特 ...

  6. [译]C# 7系列,Part 5: private protected 访问修饰符

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/10/05/c-7-series-part-5-private-protected/ C#有几个可访问性 ...

  7. [译]C# 7系列,Part 6: Read-only structs 只读结构

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/11/21/c-7-series-part-6-read-only-structs/ 背景 在.NET世 ...

  8. [译]C# 7系列,Part 7: ref Returns ref返回结果

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/12/12/c-7-series-part-7-ref-returns/ 背景 有两种方法可以将一个值传 ...

  9. [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/25/c-7-series-part-10-spant-and-universal-memory- ...

随机推荐

  1. 2019-10-16:maccms10后门复现利用,解析

    该文章仅供学习,利用方法来自网络文章,仅供参考 Maccms10基于php+mysql的maccms,是苹果的内容管理,方便使用,功能良好,适用范围广 后门网站下载网址,是假官网:http://www ...

  2. 剑指Offer-29.最小的K个数(C++/Java)

    题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 分析: 最先想到的是将数组升序排列,返回前k个元素.不过排序的话效率 ...

  3. Tensorflow的基本使用

    基本使用 使用 TensorFlow, 你必须明白 TensorFlow: • 使用图 (graph) 来表示计算任务. • 在被称之为 会话(Session)的上下文 (context) 中执行图. ...

  4. 基于 HTML5 + WebGL 的宇宙(太阳系) 3D 可视化系统

    前言 近年来随着引力波的发现.黑洞照片的拍摄.火星上存在水的证据发现等科学上的突破,以及文学影视作品中诸如<三体>.<流浪地球>.<星际穿越>等的传播普及,宇宙空间 ...

  5. @NotEmpty、@NotNull、@NotBlank注解解析

    源码解析 @NotEmpty根据JDK源码注释说明,该注解只能应用于char可读序列(可简单理解为String对象),colleaction,map,array上,因为该注解要求的是对象不为null且 ...

  6. 程序员的算法课(3)-递归(recursion)算法

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  7. kubectl: Error from server: error dialing backend: remote error: tls: internal error

    使用kubectl logs,发现报了tls的错误,然后查看kubelet的日志,发现报了上面的错误,然后通过命令kubectl get csr查看发现有很多处于pending状态 最后通过命令 ku ...

  8. mac安装pip

    1.下载get-pip.py curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py SaintKings-Mac-mini ...

  9. Codeforces Round #452 (Div. 2) A B C

    Codeforces Round #452 (Div. 2) A Splitting in Teams 题目链接: http://codeforces.com/contest/899/problem/ ...

  10. 关于CSS选择器连续性的问题

    在html中有以下结构: --- ----- <div class="row100"> <div class="col"> <di ...