nameof 运算符
0. 目录
1. 老版本的代码
1 using System;
2 namespace csharp6
3 {
4 internal class Program
5 {
6 private static void Main(string[] args)
7 {
8 if (args==null)
9 {
10 throw new ArgumentNullException("args");
11 }
12 }
13 }
14 }
这段代码并没什么问题,运行良好。随着时间的推移,有一天,我觉得args这个参数名不合适,想改一个更直观的名字filePaths,表示我要接受一个文件路径的数组。然后我们就直接把args这个名字给重构了,but,把 throw new ArgumentNullException("args"); 给忘了(resharper重构可能会同时重构这个名字),因为它仅仅是个字符串,书写的时候容易拼错,重构的时候也无法对它进行一个是否需要重构的分析,导致一些麻烦事情。
那么nameof运算符的目的就是来解决这个问题的。
2. nameof 运算符
nameof是C#6新增的一个关键字运算符,主要作用是方便获取类型、成员和变量的简单字符串名称(非完全限定名),意义在于避免我们在代码中写下固定的一些字符串,这些固定的字符串在后续维护代码时是一个很繁琐的事情。比如上面的代码改写后:
1 using System;
2 namespace csharp6
3 {
4 internal class Program
5 {
6 private static void Main(string[] args)
7 {
8 if (args==null)
9 {
10 throw new ArgumentNullException(nameof(args));
11 }
12 }
13 }
14 }
我们把固定的 "args" 替换成等价的 nameof(args) 。按照惯例,贴出来两种方式的代码的IL。
"args"方式的IL代码:
1 .method private hidebysig static void Main(string[] args) cil managed
2 {
3 .entrypoint
4 // Code size 22 (0x16)
5 .maxstack 2
6 .locals init ([0] bool V_0)
7 IL_0000: nop
8 IL_0001: ldarg.0
9 IL_0002: ldnull
10 IL_0003: ceq
11 IL_0005: stloc.0
12 IL_0006: ldloc.0
13 IL_0007: brfalse.s IL_0015
14 IL_0009: nop
15 IL_000a: ldstr "args"
16 IL_000f: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string)
17 IL_0014: throw
18 IL_0015: ret
19 } // end of method Program::Main
nameof(args)方式的IL代码:
1 .method private hidebysig static void Main(string[] args) cil managed
2 {
3 .entrypoint
4 // Code size 22 (0x16)
5 .maxstack 2
6 .locals init ([0] bool V_0)
7 IL_0000: nop
8 IL_0001: ldarg.0
9 IL_0002: ldnull
10 IL_0003: ceq
11 IL_0005: stloc.0
12 IL_0006: ldloc.0
13 IL_0007: brfalse.s IL_0015
14 IL_0009: nop
15 IL_000a: ldstr "args"
16 IL_000f: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string)
17 IL_0014: throw
18 IL_0015: ret
19 } // end of method Program::Main
一样一样的,我是没看出来有任何的差异,,,so,这个运算符也是一个编译器层面提供的语法糖,编译后就没有nameof的影子了。
3. nameof 注意事项
nameof可以用于获取具名表达式的当前名字的简单字符串表示(非完全限定名)。注意当前名字这个限定,比如下面这个例子,你觉得会输出什么结果?
1 using static System.Console;
2 using CC = System.ConsoleColor;
3
4 namespace csharp6
5 {
6 internal class Program
7 {
8 private static void Main()
9 {
10 WriteLine(nameof(CC));//CC
11 WriteLine(nameof(System.ConsoleColor));//ConsoleColor
12 }
13 }
14 }
第一个语句输出"CC",因为它是当前的名字,虽然是指向System.ConsoleColor枚举的别名,但是由于CC是当前的名字,那么nameof运算符的结果就是"CC"。
第二个语句输出了"ConsoleColor",因为它是System.ConsoleColor的简单字符串表示,而非取得它的完全限定名,如果想取得"System.ConsoleColor",那么请使用 typeof(System.ConsoleColor).FullName 。再比如微软给的例子: nameof(person.Address.ZipCode) ,结果是"ZipCode"。
4. 参考
nameof 运算符的更多相关文章
- [C#6] 2-nameof 运算符
0. 目录 C#6 新增特性目录 1. 老版本的代码 using System; namespace csharp6 { internal class Program { private static ...
- 【c# 操作符】- nameof用法
最重要的是nameof不会影响性能! nameof有什么用?主要用解决 类成员名做参数替代成员们的字符串做参数,如下: using System; namespace csharp6 { intern ...
- ASP.NET Core 中文文档 第四章 MVC(3.6.2 )自定义标签辅助类(Tag Helpers)
原文:Authoring Tag Helpers 作者:Rick Anderson 翻译:张海龙(jiechen) 校对:许登洋(Seay) 示例代码查看与下载 从 Tag Helper 讲起 本篇教 ...
- [C#6] 0-概览
1. C#6 新特性图谱 C#6的新特性主要由编译器(“Roslyn”)带来,并不依赖CLR和.NET Framework的升级,我们可以认为这个版本的新语言特性的主要目的为了简化代码书写方式,让我们 ...
- C# 6.0新特性---语法糖
转载:http://www.cnblogs.com/TianFang/p/3928172.html 所谓语法糖就是在编译器里写做文章,达到简化代码书写的目的,要慎重使用,省略过多不易理解. NULL检 ...
- C#发展历程以及C#6.0新特性
一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...
- C#6.0特性笔记
Visual Studio 2015的C#6.0,今天无意中看这个视频,怕忘记其中的特性,故此进行记录. public class Point { //Getter专属自动属性 public int ...
- VS2015预览版中的C#6.0 新功能(一)
VS2015预览版中的C#6.0 新功能(二) VS2015预览版中的C#6.0 新功能(三) VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能. 字符串添写(Str ...
- C# 6 与 .NET Core 1.0 高级编程 - C# 6 改进
个人原创译文,转载请注明出处.有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - What's New in C# 6 C# 6 改进 ...
随机推荐
- 缓存穿透 & 缓存击穿 & 缓存雪崩
参考文档: 缓存穿透和缓存失效的预防和解决:https://blog.csdn.net/qq_16681169/article/details/75138876 缓存穿透 缓存穿透是指查询一个一定不存 ...
- Gamma阶段第六次scrum meeting
每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...
- Sc config http start= disabled
我不小心使用这个命令 Sc config http start= disabled, 现在http服务 无法启动 管理员运行 sc config http start= demand & ne ...
- maven site 命令报错
在执行 mvn site 命令时报错: java.lang.NoClassDefFoundError: org/apache/maven/doxia/siterenderer/DocumentCont ...
- 使用Ajax (put delete ) django原生CBV 出现csrf token解决办法
原因 django原生CBV中对于 Ajax put 或 delete 请求进行封装时,会把请求数据放在 request.body里, 所以获取不到csrf token 方式一: 关闭csrf 中间件 ...
- spring Valid @Pattern 常见的验证表达式
1 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 2 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 3 只能输入数字:"^[0-9]*$". 4 只 ...
- day60——单表操作补充(批量插入、查询、表结构)
day60 批量插入(bulk_create) # bulk_create obj_list = [] for i in range(20): obj = models.Book( title=f'金 ...
- FusionInsight大数据开发---Streaming应用开发
Streaming应用开发 掌握Streaming基本业务开发流 熟悉Streaming常用API接口使用 掌握Streaming业务设计基本原则 了解Streaming应用开发环境 了解CQL开发流 ...
- Java异常的10个关键知识点
前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...
- C#拼音帮助类
如果使用此帮助类需要引用 using Microsoft.International.Converters.PinYinConverter; using NPinyin; 可以在NuGet里面下载 1 ...