原文: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. jQuery学习笔记3

    * 动画效果 * 在一定的时间内, 不断改变元素样式 * slideDown()/slideUp()/slideToggle() * fadeOut()/fadeIn()/fadeToggle() * ...

  2. JavaScript笔记五

    1.条件分支语句 - switch语句 - 语法: switch(条件表达式){ case 表达式: 语句... break; case 表达式: 语句... break; case 表达式: 语句. ...

  3. 【日常错误】spring-boot配置文件读取不到

    最近在用spring-boot做项目时,遇到自定义的配置文件无法读取到的问题,通过在appcation.java类上定义@PropertySource(value = {"classpath ...

  4. 堆模板(STL版)

    题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: ...

  5. javaScript中的indexOf使用方法

    JavaScript中的indexOf使用方法 概述 indexOf大小写敏感,其中的O要大写 对于字符串而言 indexOf返回字符串第一次出现的位置,若没有出现返回-1 1 var str = & ...

  6. Python与自然语言处理搭建环境

    参考书籍<Python自然语言处理>,书籍中的版本是Python2和NLTK2,我使用的版本是Python3和NLTK3 实验环境Windows8.1,已有Python3.4,并安装了Nu ...

  7. luogu P3939 数颜色 |vector

    题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排,来给他们喂胡萝卜吃. 排列完成后, ...

  8. NRF51802蓝牙4.0BLE

    今天给大家介绍一款NRF51802的芯片 它是NRF51822的COSTDOWN精简版 本质上跟NRF51822是一致的,原厂为了给大客户节省成本而定制的一个版本 可以跟NRF51822软件硬件完全兼 ...

  9. 配置React Native的开发环境

    本文转载自:http://mp.weixin.qq.com/s?__biz=MzIxNjEzNjUzOQ==&mid=402020148&idx=2&sn=ccad14a919 ...

  10. atom常用快捷键-mac亲测

    目录 最常用 其他 测试没成功 最常用 中文 快捷键 功能 新建界面窗口 Ctrl + Shift + N 新建文件 Ctrl + N 打开文件 Ctrl + O 打开文件夹 Ctrl + Shift ...