以*的名义
介绍
2014 年 11 月 12 日,微软发布了 Visual Studio 2015 的预览版。他们还发布了新版 C#,当时是 6.0。此更新带来了许多新功能。
- 字符串插值
- 异常过滤
- 自动属性初始化器
- 静态类语句
- 字典初始值设定项
- 在 catch 和 finally 块中使用 await
- 零传播运算符
这个功能列表只是展示了 2014 年 6.0 版本的重大进步。现在,我们关心的最重要的功能是nameof运算符。
名称
简而言之,这个运算符的作用就是获取一个代码元素(可以是类或其任何成员方法、变量或常量),然后返回一个同名的字符串文字。这会在编译时进行评估,在运行时不起作用。
让我们从一个简单的演示开始。
string Pluralsight = "This is a written guide!";
Console.WriteLine($"The variable with name: {nameof(Pluralsight)}, holds the value: {Pluralsight}");
这给了我们以下结果。
The variable with name: Pluralsight, holds the value: This is a written guide!
这使得代码更加优雅,同时使得跟踪所使用的属性和属性的文字名称变得更加容易。
在 C# 6.0 版之前,编程世界中经常发生一项非常常见的任务。这项任务仍然很常见,但我们的新nameof运算符减少了开销。也就是说,这项任务是在对象的属性发生变化时发送通知。下面这段代码来自我去年编写的一款关于怪物和英雄的非常简单的游戏。它没有什么特别之处,但 nameof 运算符显示了它的强大之处。如果没有这个运算符,我的代码看起来会是这样的:
public bool isAlive
{
get
{ return _isAlive; }
set
{ this.OnPropertyChanged("isAlive"); }
}
使用操作员后它看起来像这样。
public bool isAlive
{
get
{ return _isAlive; }
set
{ this.OnPropertyChanged(nameof(isAlive)); }
}
对我来说,这是一个巨大的改变,因为它减轻了将属性名称写为字符串并将其作为OnPropertyChanged事件的参数传递的需要。
另一个例子应该可以进一步巩固你的概念。
using System;
using System.Text;
namespace NameOfFeature
{
public class Worker
{
public Worker(string name, string title, string company)
{
if (name == null)
throw new ArgumentNullException(nameof(name));
else
Console.WriteLine("Name: " + name);
if (title == null)
throw new ArgumentNullException(nameof(title));
else
Console.WriteLine("Location: " + title);
if (company == null)
throw new ArgumentNullException(nameof(company));
else
Console.WriteLine("Age: " + company);
}
static void Main(String[] args)
{
Worker d = new Worker("Dániel", "DevOps Engineer", "Itronlabs");
Console.Read();
}
}
}
执行后会产生以下输出。
Name: Dániel
Location: DevOps Engineer
Age: Itronlabs
在这个例子中,我们看到,nameof运算符通过不将构造函数的属性或参数字符串化,只需利用该特性,就能帮助我们创建更简洁的应用程序。
您还可以选择指定类型和命名空间,但生成的字符串文字不是完全合格的!
Console.WriteLine(nameof(System.Collections.Generic));
以下输出让我们感到欣慰。
Generic
让我们用整数列表创建另一个示例;更具体地说,是奇数。
List<int> oddNumbers = new List<int> { 1, 3, 5, 7, 9, 11 };
Console.WriteLine(nameof(oddNumbers.Add));
Console.WriteLine(nameof(oddNumbers.Count));
Console.WriteLine(nameof(oddNumbers.FindAll));
Console.WriteLine(nameof(oddNumbers.ForEach));
Console.WriteLine(nameof(oddNumbers.IndexOf));
Console.WriteLine(nameof(oddNumbers.Remove));
执行上述代码后,我们在控制台上看到以下内容:
Add
Count
FindAll
ForEach
IndexOf
Remove
这也是运营商给我们的生活带来的功能的一个很好的例子。
In Foof We Trust: A Dialogue is a link to a very popular dialogue created by Eric Lippert. It pretty much sums up why the infoof, the predecessor of nameof, failed and why nameof succeeded.
Conclusion
In this guide, you saw a relatively new operator which made quite the difference in the lives of many programmers. From the examples we looked at, you might get the sense that this is not that big of a step forward - this is what I thought at first - . But then, the more and more I got into using it, the more I started to appreciate it. I honestly hope that this was worth your while, and your toolset was increased by at least one item after reading this article.
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~