查看: 1476|回复: 0

[.NET开发] C#6.0新特性

发表于 2018-4-24 08:00:01
C#6.0新特性 一、C#发展历程

下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的。

一、C#6.0新特性

1、字符串插值 (String Interpolation)

字符串拼接优化

Before:

  1. var Name = "joye.net";
  2. var Results = "Hello" + Name;//直接拼接
  3. var results1 = string.Format("Hello {0}", Name);//Format拼接
复制代码

After:

  1. var results2 = $"Hello {Name}"; //$拼接
  2. var results= $"Hello {Name}{new Program().GetCnblogsSite()}";//{}可以直接插入代码
复制代码

2、null检查运算符【 ?.】 (Monadic null checking)

null优化

Before:

  1. public static string GetCnblogsSite()
  2. {
  3. return "http://www.cnblogs.com/yinrq";
  4. }
复制代码
  1. Program pro = null;
  2. if(pro!=null)
  3. Console.WriteLine(GetCnblogsSite());
复制代码

After:

  1. Program pro = null;
  2. Console.WriteLine(pro?.GetCnblogsSite());
复制代码

3、 自动属性初始化器(Initializers for auto-properties)

可以直接给自动属性赋值了,不需要写在构造函数中。

Before:

复制代码
  1. public class ClassA
  2. {
  3. private string Name{get;set;};
  4. public ClassA()
  5. {
  6. Name = "joye.net";
  7. }
  8. }
复制代码
复制代码

After:

  1. public class ClassA
  2. {
  3. public string Name { get; set; } ="joye.net";
  4. }
复制代码

4、只读自动属性(Getter-only auto-properties)

只读自动属性可以直接初始化,或者在构造函数中初始化。

before

复制代码
  1. //缩小自动属性的访问权限
  2. public class ClassA
  3. {
  4. public string Name { get; private set; }
  5. }
  6. //C#1.0实现
  7. public class ClassA
  8. {
  9. private string Name = "joye.net";
  10. public string Name
  11. {
  12. get { return Name; }
  13. }
  14. }
复制代码
复制代码

after:

  1. public class ClassA
  2. {
  3. public string Name { get; } = "joye.net";
  4. }
复制代码

5、表达式方法体(Property Expressions && Method Expressions)

只读属性,只读索引器和方法都可以使用Lambda表达式作为Body。

一句话的方法体可以直接写成箭头函数,而不再需要大括号(分页控件http://www.cnblogs.com/yinrq/p/5586841.html就用到了属性表达式Property Expressions)

复制代码
  1. public class PagerInBase
  2. {
  3. /// <summary>
  4. /// 当前页
  5. /// </summary>
  6. public int PageIndex { get; set; }
  7. /// <summary>
  8. /// 页数
  9. /// </summary>
  10. public int PageSize { get; set; }
  11.      <br> //以前的写法<br>     //public int Skip{get{return (PageIndex - 1) * PageSize}}<br>
  12. //跳过序列中指定数量的元素
  13. public int Skip => (PageIndex - 1) * PageSize;
  14. /// <summary>
  15. /// 请求URL
  16. /// </summary>
  17. public string RequetUrl => System.Web.HttpContext.Current.Request.Url.OriginalString;
  18. /// <summary>
  19. /// 构造函数给当前页和页数初始化
  20. /// </summary>
  21. public PagerInBase()
  22. {
  23. if (PageIndex == 0) PageIndex = 1;
  24. if (PageSize == 0) PageSize = 10;
  25. }
  26. }
复制代码
复制代码

方法表达式(Method Expressions)

复制代码
  1. //before 的完整方法
  2. public int Skip()
  3. {
  4. return (PageIndex - 1) * PageSize
  5. }
  6. //After C#6.0 方法表达式
  7. public int Skip() => (PageIndex - 1) * PageSize;
复制代码
复制代码

6、using静态类(Static type using statements)

复制代码
  1. using System;
  2. <strong>using static System.Math;
  3. </strong>namespace ConsoleApplication1
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. Console.WriteLine(Log10(5) + PI);
  10. }
  11. }
  12. }
复制代码
复制代码

7、检查方法参数nameof表达式(nameof expressions)

这个很有用,原来写WPF中的ViewModel层的属性变化通知时,需要写字符串,或者使用MvvmLight等库中的帮助方法,可以直接传入属性,但由于是在运行时解析,会有少许性能损失。现在使用nameof运算符,保证重构安全和可读性,又提升了性能。

Before:

复制代码
  1. public static void Add(Person person)
  2. {
  3. if (person == null)
  4. {
  5. throw new ArgumentNullException("person");
  6. }
  7. }
复制代码
复制代码

After:

复制代码
  1. public static void Add(Person person)
  2. {
  3. if (person == null)
  4. {
  5. throw new ArgumentNullException(nameof(person));
  6. }
  7. }
复制代码
复制代码

8、带索引的对象初始化器(Index initializers )

直接通过索引进行对象的初始化

  1. var dic = new Dictionary<int, string> { [0]="joye.net",[1]= "http://yinrq.cnblogs.com/",[2]= "Index initializers " };
复制代码

9、catch和finally 中使用await (catch和finally 中的 await )

在C#5.0中,await关键字是不能出现在catch和finnaly块中的。而C#6.0可以

复制代码
  1. try
  2. {
  3. res = await Resource.OpenAsync(…); // You could do this
  4. }
  5. catch (ResourceException e)
  6. {
  7. await Resource.LogAsync(res, e); // Now you can do this
  8. }
  9. finally
  10. {
  11. if (res != null)
  12. await res.CloseAsync(); // finally and do this.
  13. }
复制代码
复制代码

10、内联out参数(Inline declarations for out params)

before

  1. int x;
  2. int.TryParse("123", out x);
复制代码

after:

  1. int.TryParse("123", out int x);
复制代码

11、无参数的结构体构造函数(Parameterless constructors in structs)

复制代码
  1. public struct MyStruct
  2. {
  3. public int A { get; }
  4. public int B { get; }
  5. public MyStruct(int a, int b) { A = a; B = b; }
  6. public MyStruct(): this(0, 1) { }
  7. }
复制代码
复制代码
  1. WriteLine(new MyStruct().ToString());
  2. WriteLine(default(MyStruct).ToString());
复制代码


回复

使用道具 举报