[译]C# 7系列,Part 3: Default Literals 默认文本表达式
原文: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 1: Value Tuples 值元组
- [译]C# 7系列,Part 2: Async Main 异步Main方法
- [译]C# 7系列,Part 3: Default Literals 默认文本表达式 (本文)
- [译]C# 7系列,Part 4: Discards 弃元
- [译]C# 7系列,Part 5: private protected 访问修饰符
- [译]C# 7系列,Part 6: Read-only structs 只读结构
- [译]C# 7系列,Part 7: ref Returns ref返回结果
- [译]C# 7系列,Part 8: in Parameters in参数
- [译]C# 7系列,Part 9: ref structs ref结构
- [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理 (完)
(本文)
[译]C# 7系列,Part 3: Default Literals 默认文本表达式的更多相关文章
- [译]C# 7系列,Part 9: ref structs ref结构
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了 ...
- [译]C# 7系列,Part 8: in Parameters in参数
原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数 ...
- [译]C# 7系列,Part 1: Value Tuples 值元组
Mark Zhou写了很不错的一系列介绍C# 7的文章,虽然是2年多年前发布的,不过对于不熟悉C# 7特性的同学来说,仍然有很高的阅读价值. 原文:https://blogs.msdn.microso ...
- [译]C# 7系列,Part 2: Async Main 异步Main方法
原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...
- [译]C# 7系列,Part 4: Discards 弃元
原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/27/c-7-series-part-4-discards/ 有时我们想要忽略一个方法返回的值,特 ...
- [译]C# 7系列,Part 5: private protected 访问修饰符
原文:https://blogs.msdn.microsoft.com/mazhou/2017/10/05/c-7-series-part-5-private-protected/ C#有几个可访问性 ...
- [译]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世 ...
- [译]C# 7系列,Part 7: ref Returns ref返回结果
原文:https://blogs.msdn.microsoft.com/mazhou/2017/12/12/c-7-series-part-7-ref-returns/ 背景 有两种方法可以将一个值传 ...
- [译]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- ...
随机推荐
- H3C交换机DHCP基础配置案例 v7版本
一.需求 要求在Switch A上配置DHCP服务器功能实现:• 为网络内的客户端动态分配 10.1.1.0/24 网段内的 IP 地址.租用有效期限. DNS 信息.网关地址等配置信息:• 根据 S ...
- python+selenium +unittest生成HTML测试报告
python+selenium+HTMLTestRunner+unittest生成HTML测试报告 首先要准备HTMLTestRunner文件,官网的HTMLTestRunner是python2语法写 ...
- 删除节点(removeChild())
remoceChild():方法将从一个给定元素里删除一个子节点: reference = element.removeChild(node); 这个方法的返回值是一个指向已经被删除的子节点的引用指针 ...
- PHP如何获取视频总时长与码率等信息
利用PHP中的FFmpeg读取视频播放时长与码率等信息 function getVideoInfo($file) { define('FFMPEG_PATH', '/usr/local/ff ...
- while(cin)?
#include<iostream> #include<utility> using namespace std; int main() { int i; do { cout& ...
- Tensorflow搭建CNN实现验证码识别
完整代码:GitHub 我的简书:Awesome_Tang的简书 整个项目代码分为三部分: Generrate_Captcha: 生成验证码图片(训练集,验证集和测试集): 读取图片数据和标签(标签即 ...
- 在vue中使用基于d3为基础的dagre-d3.js搞定一个流程图组件
项目中想搞定一个流程图,开始使用了阿里的G6,但是G6目前不支持手势,这样就很郁闷了,因为公司的领导都是使用iPad看的,你不支持手势是不行的,后来又想到了百度的echarts,试了试,感觉还不错,手 ...
- tp5实现支付宝电脑支付(详解)
首先吐槽一下支付宝的官方文档,它只是简单介绍一下开发的流程和参数,而对于新人来说如果只看它的官方文档很多时候是看不懂的,我也是边看文档边网上查资料才把它弄懂.下面我详细介绍支付宝的电脑支付是如何实现 ...
- mysql的两阶段协议(封锁定理,虫洞事务)
我们都知道数据库的事务具有ACID的四个属性:原子性,一致性,隔离性和持久性.然后在多线程操作的情况下,如果不能保证事务的隔离性,就会造成数据的修改丢失(事务2覆盖了事务1的修改结果).读到脏数据(事 ...
- 二叉树的建立&&前中后遍历(递归实现)&&层次遍历
下面代码包含了二叉树的建立过程,以及三种遍历方法了递归实现,代码中还利用队列实现了层次遍历. import java.util.LinkedList; import java.util.Queue; ...