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

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

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

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

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

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的代码以下:url

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

使用string interpolation的代码以下:spa

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();
}

 以下图,两种方式的输出是同样的:code

 

总结:orm

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

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 ?? 0;

//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 ?? 0;

     //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。

相关文章
相关标签/搜索