page contents

C#基础知识之nameof 的优点

本文讲述了C#基础知识之nameof 的优点!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-07-ibAEpb8n62ccd61940b19.png

本文讲述了C#基础知识之nameof 的优点!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

nameof 表达式可生成变量、类型或成员的名称作为字符串常量。

一、 旧代码

 using  System;
 namespace csharp6
 {
     internal class Program
     {
         private static void Main(string[] args)
         {
             if (args==null)
             {
                 throw new ArgumentNullException("args");
             }
         }
     }
 }

这段代码并没什么问题,运行良好。随着时间的推移,有一天,我觉得args这个参数名不合适,想改一个更直观的名字filePaths,表示我要接受一个文件路径的数组。然后我们就直接把args这个名字给重构了,但是把

throw new ArgumentNullException("args");

给忘了,因为它仅仅是个字符串,书写的时候容易拼错,重构的时候也无法对它进行一个是否需要重构的分析,导致一些麻烦事情。那么nameof运算符的目的就是来解决这个问题的。

二、nameof 运算符

nameof是C#6新增的一个关键字运算符,主要作用是方便获取类型、成员和变量的简单字符串名称(非完全限定名),意义在于避免我们在代码中写下固定的一些字符串,这些固定的字符串在后续维护代码时是一个很繁琐的事情。比如上面的代码改写后:

 using  System;
 namespace csharp6
 {
      internal class Program
      {
          private static void Main(string[] args)
          {
              if (args==null)
              {
                 throw new ArgumentNullException(nameof(args));
             }
         }
     }
 }

我们把固定的 "args" 替换成等价的 nameof(args) 。按照惯例,贴出来两种方式的代码的IL。

"args"方式的IL代码:

  .method private hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // Code size       22 (0x16)
    .maxstack  2
    .locals init ([0] bool V_0)
    IL_0000:  nop
    IL_0001:  ldarg.0
    IL_0002:  ldnull
    IL_0003:  ceq
    IL_0005:  stloc.0
    IL_0006:  ldloc.0
    IL_0007:  brfalse.s  IL_0015
    IL_0009:  nop
    IL_000a:  ldstr      "args"
    IL_000f:  newobj     instance void [mscorlib]System.ArgumentNullException::.ctor(string)
    IL_0014:  throw
    IL_0015:  ret
 } // end of method Program::Main

nameof(args)方式的IL代码:

  .method private hidebysig static void  Main(string[] args) cil managed
  {
   .entrypoint
   // Code size       22 (0x16)
   .maxstack  2
   .locals init ([0] bool V_0)
   IL_0000:  nop
   IL_0001:  ldarg.0
   IL_0002:  ldnull
   IL_0003:  ceq
   IL_0005:  stloc.0
   IL_0006:  ldloc.0
   IL_0007:  brfalse.s  IL_0015
   IL_0009:  nop
   IL_000a:  ldstr      "args"
   IL_000f:  newobj     instance void [mscorlib]System.ArgumentNullException::.ctor(string)
   IL_0014:  throw
   IL_0015:  ret
 } // end of method Program::Main

一样一样的,我是没看出来有任何的差异,so,这个运算符也是一个编译器层面提供的语法糖,编译后就没有nameof的影子了。

三、 nameof 注意事项

nameof可以用于获取具名表达式的当前名字的简单字符串表示:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string strL= "hello";
            Console.WriteLine(nameof(strL));//CC
            Console.WriteLine(nameof(System.ConsoleColor));//ConsoleColor

            Console.ReadKey();
        }
    }
}

第一个语句输出"strL",因为它是当前的名字,那么nameof运算符的结果就是"strL"。

第二个语句输出了"ConsoleColor",因为它是System.ConsoleColor的简单字符串表示,而非取得它的完全限定名,如果想取得"System.ConsoleColor",那么请使用

 typeof(System.ConsoleColor).FullName

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg



  • 发表于 2022-07-12 10:02
  • 阅读 ( 434 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章