VS2015预览版中的C#6.0 新功能(二)

VS2015预览版中的C#6.0 新功能(三)

VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能。

字符串添写(String interpolation)
      在格式化字符串时,string.Format是经常被用到的,它确实很方便使用,但是这种使用占位符,然后通过参数替换的方式还不够方便, 在C#6.0里,String interpolation语法的引入提供了另一种格式化字符串的方式。请看下面的例子:
假设我们现在有个如下所示的Book类,现在需要格式化它的字段以输出关于该book的描述。

public class Book
{
public int Number { get; set; } public string Name { get; set; } public string Abstract { get; set; } public float Price { get; set; } public List<Author> Authors { get; set; }
}

使用string.Format的代码如下:

var introUsingStringFormat = string.Format("[{0}]' price is {1:F3}, its description is {2}.", book.Name, book.Price, book.Abstract);

使用string interpolation的代码如下:

var introUsingStrInterPolation = "[\{book.Name}]' price is \{book.Price : F3}, its description is \{book.Abstract}.";

完整的程序如下:

public void Show()
{
//interpolate string
var book = new Book
{
Abstract = "Book about C#6.0",
Name = "C#6.0 new feature",
Price = 10.8709f,
}; var introUsingStrInterPolation = "[\{book.Name}]' price is \{book.Price : F3}, its description is \{book.Abstract}.";
var introUsingStringFormat = string.Format("[{0}]' price is {1:F3}, its description is {2}.", book.Name, book.Price, book.Abstract);
Console.WriteLine("format string using string interpolation:");
Console.WriteLine(introUsingStrInterPolation);
Console.WriteLine("===============================================================================");
Console.WriteLine("format string using string.Format method:");
Console.WriteLine(introUsingStringFormat);
Console.Read();
}

如下图,两种方式的输出是一样的:

总结:

String Interpolation语法允许你在字符串里直接插入代码并可以像string.Format 那样指定format Specifier和对齐,如上面的例子\{book.Price : F3}指定price的精度为3。这个语法在之后版本中会变得更加简洁,可能会采用如下的格式:

var introUsingStrInterPolation = $"[{book.Name}]' price is {book.Price : F3}, its description is {book.Abstract}.";

空条件运算符?

如下面例子所示, 在程序中经常会出现对表达式中对象是否为空的连续检测。

 if (book != null && book.Authors != null)
{
var countOfAuthers = book.Authors.Count;
}

空条件运算符?使得这种检测更加方便,表达更加简洁,其使用方法如下:

var countOfAuthersUsingNullConditional = book?.Authors?.Count;

空条件运算符?用在成员运算符.和索引前面,会执行下面的操作:
 如果其前面的对象为空,那么直接返回null,否则允许访问前面对象的成员或者元素以继续后面运算,所以上面的表达式和下面的代码段是等价的

 if (book == null)
{
countOfAuthorsUsingNullConditional = null;
}
else if (book.Authors == null)
{
countOfAuthorsUsingNullConditional = null;
}
else
{
countOfAuthorsUsingNullConditional = book.Authors.Count;
}

上面的code展示了其执行的逻辑顺序,达到相同结果的简洁写法如下:

if(book == null || book.Authors == null)
{
countOfAuthorsUsingNullConditional = null;
}
else
{
countOfAuthorsUsingNullConditional = book.Authors.Count;
}

从上可以看出其具有如下特性:

  1. 包含?的表达式返回的是引用类型
  2. ?具有类似逻辑运算符||和&&的短路逻辑
  3. ?自己可以组成链,正如上面例子所示的,在同一表达式中连续使用?

此外,空条件运算符还具有如下特点:

  1. 对其前面的对象是否为空只进行一次计算
  2. 可以与合并运算符??一起使用更加方便
  3. ?后面不能直接跟随使用()的方法调用,对于event或者delegate可以使用?.Invoke的方式来使用,由于?只计算其右边部分一次并把其保存到临时变量中,所以它是线程安全的

下面来看一些针对2和3的例子:

//using with coalescing operator ??
int numberOfAuthors = book?.Authors?.Count ?? ; //using with delegate.
action?.Invoke();

完整的程序如下:

public void Show()
{
//traditional way
if (book != null && book.Authors != null)
{
var countOfAuthors = book.Authors.Count;
Console.WriteLine("===================using tranditional way==============");
Console.WriteLine(countOfAuthors);
} //the way of using null-conditional operator.
var countOfAuthorsUsingNullConditional = book?.Authors?.Count;
Console.WriteLine("===================null-conditional operator==============");
Console.WriteLine(countOfAuthorsUsingNullConditional);
Console.Read(); //the logic of the expression.
if (book == null)
{
countOfAuthorsUsingNullConditional = null;
}
else if (book.Authors == null)
{
countOfAuthorsUsingNullConditional = null;
}
else
{
countOfAuthorsUsingNullConditional = book.Authors.Count;
}
//the concise edition using tranditional way.
if (book == null || book.Authors == null)
{
countOfAuthorsUsingNullConditional = null;
}
else
{
countOfAuthorsUsingNullConditional = book.Authors.Count;
}
//using with coalescing operator ??
int numberOfAuthors = book?.Authors?.Count ?? ; //using with delegate.
action?.Invoke();
}

nameof表达式

有时候我们需要获得代码中某些symbol的名字,例如在throw ArgumentNullException时,需要获得为null参数的名字(字符串形式),在调用PropertyChanged时,我们也需要获得属性的名字,直接使用字符串具有如下的缺点:

  1. 容易拼写错误
  2. 无法重构
  3. 没有语法检查

nameof表达式能够以字符串的形式返回参数对象或者类成员的名字,下面是一些例子

 var nameOfClassPropertyObject = nameof(book);
var nameOfArgument = nameof(author);
var classMethodMember = nameof(Book.Equals);
var classPropertyMember = nameof(Book.Number);
var @class =  nameof(Book);

从上面的例子中可以看出nameof运算符可以用于类(包括attribute类),类的成员,对象上,另外需要注意的是它只会输出最终元素的名字不会包含其前缀,例如nameof(Book.Equals)的输出是Equals。

VS2015预览版中的C#6.0 新功能(一)的更多相关文章

  1. VS2015预览版中的C#6.0 新功能(二)

    VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(三) 自动属性的增强 只读自动属性 以前自动属性必须同时提供setter和getter方法,因而只读属性只能通 ...

  2. VS2015预览版中的C#6.0 新功能(三)

    VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(二) Using static 使用using StaticClass,你可以访问StaticClass类里的 ...

  3. VS2015预览版体验

    .NET开源了,JAVA颤抖吧... 据说VS2015可以开发android,ios,wp应用程序了,还可以开发能运行在mac,linux上的ASP.NET网站,如果真是这样就太爽啦,上微软官网下载了 ...

  4. Windows 10 开发人员预览版中的新增功能(转自 IT之家)

    Windows 10 开发人员预览版中的新增功能 在Win10预览版中安装工具与SDK后,即可着手创建Windows通用应用或先浏览目前的环境与此前相比都发生了什么变化. 应用建模 文件资源管理器: ...

  5. 关于在Visual Studio 2019预览版中的用户体验和界面的变化

    原文地址:https://blogs.msdn.microsoft.com/visualstudio/2018/11/12/a-preview-of-ux-and-ui-changes-in-visu ...

  6. 根据 Power BI Desktop(预览版)中的报表页创建工具提示

    根据 Power BI Desktop 中创建的报表页,可创建直观丰富的报表工具提示,这些提示在你将鼠标悬停在视觉对象上时显示. 通过创建用作工具提示的报表页,使自定义工具提示包含视觉对象.图像以及在 ...

  7. 挑战中英实时语音翻译——Skype Translator 中文预览版登陆中国

    Translator 中文预览版登陆中国" title="挑战中英实时语音翻译--Skype Translator 中文预览版登陆中国"> 今天,我们正式宣布在中国 ...

  8. 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新

    原文 | Daniel Roth 翻译 | 郑子铭 .NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一 ...

  9. .NET 7 预览版2 中的 ASP.NET Core 更新

    .NET 7 预览版2 现已推出,其中包括对ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: 推断来自服务的API 控制器操作参数 SignalR 集线器方法的依赖注入 为 ...

随机推荐

  1. 通过 sp_configure 进行 Database Mail 配置

    通过 sp_configure 进行 Database Mail 配置 直接执行步骤一. 如果报错,则先执行步骤二,再执行步骤一. 一. sp_configre ; GO RECONFIGURE; G ...

  2. C#如何设置下拉COMMBOX为不可输入,只有下拉条目

    设置下拉框的DropDownStyle属性为DropDownList

  3. C#拖动自己的定义标题栏(panel)以及实现窗体拖动关闭和最小化

    //没有标题 this.FormBorderStyle = FormBorderStyle.None; //任务栏不显示 this.ShowInTaskbar = false; //实现拖动 1.在窗 ...

  4. 快速搭建Android 开发环境-使用ADT Bundle

    一.搭建Android开发环境 近日要学Android开发基础,就着手搭建Windows下的Android开发环境. 找了一些相关的博文参考,基本上都是要分别下载和安装JDK, Eclipse, An ...

  5. linux修改密码

    情景:Linux 服务器上用户的密码被服务器管理员发现太过简单,需要重置密码.处理时为了方便记忆,就直接使用普通用户登录,修改密码时,在原密码的基础上增加一串特定的数字,结果提示不通过.例如出现错误提 ...

  6. deb包处理

    1.卸载 dqpg -l 查看信息 dqpg -r  ******  卸载 2.安装 dqpg -i ...............deb

  7. C语言预处理指令的初步了解

    所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分 ...

  8. 一种针对虚拟机的应用软件License认证方法

    由于虚拟机的硬件信息可以随意修改,使得虚拟机可能具有相同的硬件信息,在传统的应用软件License认证方式中会导致License认证漏洞.本专利提供了一种有效的解决方法. 文/王宏财 目 前,云计算的 ...

  9. VCMI Mods list

    http://heroescommunity.com/viewthread.php3?TID=40902 http://heroes3wog.net/ http://heroes3towns.com/ ...

  10. mysql/Java服务端对emoji的支持

    更改好后的字符集: 乱码 推荐大家看 深入MySQL字符集设置 ,区分检查client端.server端的编码:最简单暴力的方式,是在所有的环节都显式明确的指定相同的编码. 比如使用python的My ...