30分钟掌握 C#6

1. 只读自动属性(Read-only auto-properties)

 C# 6之前我们构建只读自动属性:

 public string FirstName { get; private set; }

public string LastName { get; private set; }

原理解析:就是编译器在生成set访问器时,它的修饰符是private,由上可知所谓的只读只是针对类外部,在类内部还是可以随意修改属性值的。

 C# 6中提供了真正的只读自动属性,写法如下:

 public string FirstName { get; }
public string LastName { get; }

 原理解析:首先编译器会生成一个readonly的私有字段而get访问器就是返回该字段的值,由上可知该只读自动属性只能在构造函数中为其赋值。

2. 自动属性初始化器(Auto-Property Initializers)

 以前自动属性的赋值操作我们只能写在方法中,如构造函数:

 public Student(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}

 但在C# 6中我们可以把赋值操作当作声明的一部份,如下所示:

public string FirstName { get; set; } = "Corleone";
  public string LastName { get; set; } = "Mike";

 备注:其实C# 6和之前的版本都一样赋值操作最终都是在方法中完成,但后者明显更简洁直观,所以这是个不错的语法糖。

3. 函数成员的表达式体(Expression-bodied function members)

 C# 6中提供的一个新语法:对于只有一条语句的方法体可以简写成表达式。如下面两种情况:

 1. 方法(Methods)

  public Student Create() => new Student();

 等同于:

 public Student Create()
{
return new Student();
}

 2. 只读属性(read only properties)

 public string FullName => string.Format("{0},{1}", FirstName, LastName);

 等同于:

public string FullName

  {

      get

      {

          return string.Format("{0},{1}", FirstName, LastName);

      }

  }

原理解析:上面的表达式在编译后会生成最原始的方法体和访问器,值得一提的是函数表达式体跟Lambda是两个相似但不相同的东西,函数的表

达式体只能带一句话且不能包含return关键字但Lambda 能带语句块和包含关键字。

4. 使用静态(using static)

 C# 6中的一个新语法:使用类型的静态成员时可以省略其类型,如下所示:

using static System.String;      
// 先导入对应成员类型
public bool IsNull(string str) => IsNullOrEmpty(str);

 等同于:

public bool IsNull(string str) => string.IsNullOrEmpty(str);

总结:该语法糖的目的是使代码变得更简洁,但这个应该是区分使用场景的,如:数学计算(Math类)使用此语法糖的确能够简洁代码提高可读

性,但在某处如果导入过多的类型那么不仅不能提高阅读性反而会增加阅读难度,因为你不知道这些成员具体属于那个类型。还有若类型本身存在

同名使用时则会使用类型成员覆盖。

注意:使用静态这一语法糖并不适用扩展方法,因为扩展方法的设计理念就是不修改已有代码且只能在一定范围内使用,所以在特殊情况下需要将

其当作静态方法来使用,那么使用类名调用反而是比较明智的。

5. Null条件运算符(Null-conditional operators)

 稍有经验的童鞋都知道在Coding过程中经常要判断变量的值是否为null,类似这种if-else的操作还不少。这使得代码看起来十分不简洁,好在C#6

 中提供了解决方法:

 var student = new Student();
var firstName = student?.FirstName;

等同于:

var student = new Student();


  string firstName = null;

  if (student != null)

  {

      firstName = student.FirstName;

  }

使用方法:只需替换成员访问符 . ?. ,若 ?. 左边为null则整个运算符的结果也为null,否则运算符的结果就等于其成员值。假如成员的类型为值

型则整个表达式返回的类型是对应类型的可空类型,如:

1   int? age = student?.Age;

 原理解析: ?. 编译后就是 if三元运算符,非赋值操作(如:call)会编译成 if,赋值操作一般会编译成三元运算符。

6. 字符串插值(String Interpolation)

 C# 6中提供了一种新语法来构建格式化字符串,如:

1   var fullName = $"{student.FirstName},{student.LastName}";

 等同于:

var fullName = string.Format("{0},{1}", student.FirstName, student.LastName);

 使用方法:只需在字符串前加上$符号,然后在大括号中填写表达式(字段、方法、Lambdad...)即可。

 备注:

 1. 字符串插值语法支持以前所有字符串格式设置(此项仅支持 .net framework,不支持 .net core 1.0.1),如:

 Console.WriteLine($"平均成绩:{student.GPA:F2}");

 注:因为 : 总被编译器解释为表达式与字符串格式的分隔符,所以表达式中若有条件运算符则我们需要用括号来强制编译将其解析成当前语境所要

 表达的意义。如:

 Console.WriteLine($"平均成绩:{(student.GPA > 80 ? student.GPA : 0):F2}");

 2. 字符串插值语法可以嵌套,如:

 var score = $"我的各科成绩:{ $"数学:{student.MathScores};英语:{student.EnglishScore};"}";

 原理解析:$"xxx{expression1}xxx{expression2}..." 编译后就是string.Format()。

7. 异常过滤器(Exception Filters)

 C# 6中的一个新功能就是异常过滤器,它可以使我们在恰当的时机来应用Catch子句,如:

try

  {

      throw new WebException("Request timed out..", WebExceptionStatus.Timeout);

  }

  catch (WebException webEx) when (webEx.Status == WebExceptionStatus.Timeout)

  {

      // Exception handling

  }

使用方法:try-catch() when()。

 总结:异常过滤器最大的亮点就是在使用恰当的情况下可以不丢失异常引发点的堆栈信息,这对程序的排错至关重要。另外它还有很多有意思的用

 法,大家可以上网查下。

8. nameof表达式(nameof Expressions)

 

public string FullName(Student student)

  {

      if (student == null)

          throw new ArgumentNullException(nameof(student));


      return $"{student.FirstName},{student.LastName}";

  }

优点:nameof 表达式它能够理解成员,当成员被重命名时nameof表达式中也重命名了,而常量字符串表示法是没有样的优势。

缺点:nameof 表达式生成的是不完全限定名,若你需要完全限定名 nameof 就不能帮你了。

原理解析:nameof 是编译期间就确定其(成员)字符串名称的,即编译后就是常量字符串的表现形式了。

9. 在Catch和Finally中使用Await(Await in Catch and Finally blocks)

 C# 5 提供的 async 和 await 使异步编程变得极为简便,但它们也有着局限性:await在catch和finally块中不能使用。但个问题已在C# 6中得到

 了解决,如:

public static async Task<string> MakeRequestAndLogFailures()

  {

      await logMethodEntrance();

      try

      {

          // ....

          var responseText = await streamTask;

          return responseText;

      }

      catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))

      {

          await logError("Recovered from redirect", e);

          return "Site Moved";

      }

      finally

      {

          await logMethodExit();

      }

  }

10. Index初始化器(Index Initializers)

 这个功能并没有什么新意,其实以前就支持集合/字典 初始化器了,如:

var list = new List<string>()

  {

      "Mike",

      "Jim"

  };

   

  var dic = new Dictionary<int, string>()

  {

      { 20, "Mike" },

      { 30, "Jim"  }

  };

在C# 6中只是字典初始化器支持了新的写法,如:

var dic = new Dictionary<int, string>()
{
[20] = "Mike",
[30] = "Jim"
};

总结:暂无发现特殊的用法。

11. 改进的重载解析—编译器(Improved overload resolution)

  这算不上是新语法,因为仅仅是编译器的改进,之所以一提是想让大家知道有这么一回事。以前的编译器是识别不了 Task.Run(Func<Task>())

  的,如下

static Task DoThings()

  {

      return Task.FromResult(0);

  }

  

  Task.Run(DoThings);  // 此处省略方法代码...

上述代码在老版本编译器下是编译不通过的,而在新版本编译器是能编译通过的。

备注:值得一提的是新版本编译器也只是识别了Task.Run(Func<Task>()),Task.Run(Action) 还是识别不了,总的来说此功能对我们用处不大,

还不如乖乖的写回Lambda表达式。

原文地址:http://www.cnblogs.com/VVStudy/p/6426923.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019蓝桥杯省赛---java---A---6(完全二叉树的权值)

题目描述 思路分析 等差数列 代码实现 package lanqiao;import java.util.*; public class Main {public static void main(final String[] args) {Scanner sc new Scanner(System.in);int nsc.nextInt();int[]numsnew int[n1];long maxSum0;int minDeepInteger.MAX_VALUE;…

如何让面试官认可你的简历

转载自 如何让面试官认可你的简历 在之前的博客里写了很多面试技巧&#xff0c;这是有个前提&#xff1a; 至少候选人被面试了&#xff01; 在这个前提下&#xff0c;候选人哪怕失败了&#xff0c;至少也能用实战来检验和校对面试准备的结果&#xff0c;用句比较时髦的话来…

Linux中安装nc(netcat)常见问题

Linux中安装nc&#xff08;netcat&#xff09;常见问题 Spark Streaming编写wordCount程序时&#xff0c;在Linux集群中需要安装nc&#xff0c;来对程序中使用到的端口进行开放。在安装nc的时候&#xff0c;常出现的问题有以下几点!1、不建议使用 yum staill nc 进行安装&…

服务器c盘有个inetpub文件夹,老司机为你示范win10系统C盘inetpub文件夹删不掉的图文教程...

也许大家在用电脑工作的使用中会遇到win10系统C盘inetpub文件夹删不掉的情况&#xff0c;目前就有很多朋友向我资讯关于win10系统C盘inetpub文件夹删不掉的具体处理步骤。小编把总结的关于win10系统C盘inetpub文件夹删不掉的方法了教给大家&#xff0c;只用你按照  1、右键点…

体验VS2017的Live Unit Testing

相对于传统的Unit Test,VS2017 带来了一个新的功能,叫Live Unit Testing,从字面意思理解就是实时单元测试,在实际的使用中,这个功能就是可以在编写代码的时候进行实时的background的单元测试. 在体验之前,有几点注意事项是需要了解的: 1.目前 live unit tesing仅仅支持 C#和V…

sqlserver复习总结

--已知有一个表&#xff1a;该表的字段有&#xff1a;id,name,date,gradeid,email --1.插入一条记录&#xff1a; insert into table_name values (1,刘世豪,2017-10-21,1,666qq.com) --2.修改 update table_name set name 张云飞 where id 1 --3.删除 delete from table_name…

Map的两种遍历方法

COPY/*** HashMap的使用* 存储结构&#xff1a;哈希表&#xff08;数组链表红黑树&#xff09;*/public class Demo2 {public static void main(String[] args) {HashMap<Student, String> hashMapnew HashMap<Student, String>();Student s1new Student("tan…

服务器windows系统如何登陆,如何登陆windows云服务器

如何登陆windows云服务器 内容精选换一换远程登录的账号和密码是多少&#xff1f;登录云服务器的用户名和密码&#xff1a;Windows操作系统用户名&#xff1a;AdministratorLinux操作系统用户名&#xff1a;root登录云服务器的用户名和密码&#xff1a;Windows操作系统用户名&a…

Java集合面试问题

转载自 Java集合面试问题 Java集合框架为Java编程语言的基础&#xff0c;也是Java面试中很重要的一个知识点。在本文中&#xff0c;列出了一些关于Java集合的重要问题和答案。 1.Java集合框架是什么&#xff1f;说出一些集合框架的优点&#xff1f; 每种编程语言中都有集合…

深入.net平台的分层开发

一、搭建三层的步骤&#xff1a; 1.创建一个窗体应用程序&#xff1a;新建–》新建项目–》选择窗体应用程序–》给项目命名–》选择存放的路径。 2.创建数据访问层&#xff08;DLL层&#xff09;&#xff1a;文件–》添加–》新建项目–》选择类库–》起个名字&#xff08;项目…

2018蓝桥杯省赛---java---B---8(日志统计)

题目描述 小明维护着一个程序员论坛。现在他收集了一份"点赞"日志&#xff0c;日志共有N行。其中每一行的格式是&#xff1a; ts id 表示在ts时刻编号id的帖子收到一个"赞"。 现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长…

法兰克服务器电源维修,发那科FANUC系统控制电源简介

摘要发那科系统电源 推荐的外部24VDC电源(稳压电源)(电源电压必须满足UL1950的要求)。该电源不能与机床强电柜内I/O点或伺服电动机的抱闸共用。如果在控制单元的电源关掉后断开电池&#xff0c;则控制单元中存储的绝对脉冲编码器的当前位置&#xff0c;系统参数&#xff0c;程序…

这些代码优化的方法,你都用过吗

转载自 这些代码优化的方法&#xff0c;你都用过吗 代码优化的最重要的作用应该是&#xff1a; 避免未知的错误 在代码上线运行的过程中&#xff0c;往往会出现很多我们意想不到的错误&#xff0c;因为线上环境和开发环境是非常不同的&#xff0c;错误定位到最后往往是一个…

myeclipse如何换一个漂亮的主题

熟悉hbuilder的童鞋们都知道&#xff0c;在开发的时候主题有好几种可以随意切换&#xff0c;但是在开发java时用到的myeclipse的主题是否可以随意切换呢&#xff1f;如果可以在哪里切换&#xff0c;今天我们就来看看如何修改myeclipse的主题&#xff01; 一、首先我们要切换个漂…

基于C#.NET的高端智能化网络爬虫

前两天朋友发给我了一篇文章&#xff0c;是携程网反爬虫组的技术经理写的&#xff0c;大概讲的是如何用他的超高智商通过&#xff08;挑衅、怜悯、嘲讽、猥琐&#xff09;的方式来完美碾压爬虫开发者。今天我就先带大家开发一个最简单低端的爬虫&#xff0c;突破携程网超高智商…

2019蓝桥杯省赛---java---B---7(外卖店优先级)

题目描述 时间限制: 1.0s 内存限制: 512.0MB 本题总分&#xff1a;20 分 【问题描述】 “饱了么”外卖系统中维护着 N 家外卖店&#xff0c;编号 1 ∼ N。每家外卖店都有 一个优先级&#xff0c;初始时 (0 时刻) 优先级都为 0。 每经过 1 个时间单位&#xff0c;如果外卖店没有…

left join 和 left outer join 的区别

通俗的讲&#xff1a; A left join B 的连接的记录数与A表的记录数同 A right join B 的连接的记录数与B表的记录数同 A left join B 等价B right join A table A: Field_K, Field_A 1 a 3 b 4 c table B: Field_K, Field_B 1 x 2 y 4 z select a.Field_K, a.…

服务器母鸡系统,母鸡云服务器

母鸡云服务器 内容精选换一换云耀云服务器创建成功后&#xff0c;您可以根据需求&#xff0c;修改云服务器的名称。系统支持批量修改多台云耀云服务器的名称&#xff0c;修改完成后&#xff0c;这些云耀云服务器的名称相同。登录控制台。单击管理控制台左上角的&#xff0c;选择…

在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持

HAL&#xff0c;全称为Hypertext Application Language&#xff0c;它是一种简单的数据格式&#xff0c;它能以一种简单、统一的形式&#xff0c;在API中引入超链接特性&#xff0c;使得API的可发现性&#xff08;discoverable&#xff09;更强&#xff0c;并具有自描述的特点。…

.net三层架构开发步骤

City城市表&#xff0c;id ,name,password,address,phone; 1.新建一个windows窗体应用程序&#xff0c;CitySys 2.文件–》添加–》新建项目–》类库&#xff08;CitySysModel&#xff09;–》重命名class1.cs的类&#xff08;CityModel&#xff09;。 3.根据数据表里面的字段&…