三十分钟快速掌握C# 6.0知识点

一、只读自动属性(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访问器就是返回该字段的值,由上可知该只读自动属性只能在构造函数中为其赋值。

二、自动属性初始化器(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和之前的版本都一样赋值操作最终都是在方法中完成,但后者明显更简洁直观,所以这是个不错的语法糖。

三、函数成员的表达式体(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 能带语句块和包含关键字。

四、使用静态(using static)

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

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

等同于:

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

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

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

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

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

五、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,否则运算符的结果就等于其成员值。假如成员的类型为值

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

 int? age = student?.Age;

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

六、字符串插值(String Interpolation)

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

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

等同于:

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

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

备注:

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()。

七、异常过滤器(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()。

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

八、nameof表达式(nameof Expressions)

nameof 表达式的功能是获取成员名称,如抛异常:

public string FullName(Student student)
 {
  if (student == null)
   throw new ArgumentNullException(nameof(student));

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

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

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

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

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

十、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"
 };

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

十一、改进的重载解析—编译器(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表达式。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • C# 6.0 新特性汇总

    1. 静态using(static using) 静态using声明允许不使用类名直接调用静态方法. The static using declaration allows invoking static methods without the class name. In C# 5 using System; Console.WriteLine("Hello, World!"); In C# 6 using static System.Console; WriteLine("

  • C# 6.0 的知识梳理

    序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 虽说出了一段时间,但是似乎有许多园友对这一块知识并不了解,如拼接字符串的 $ 符号,在此,小人献上拙作一篇<C# 6.0 的知识梳理>,祝大家在新的一年里:年年有今日,岁岁有今朝,月月涨工资,周周中彩票,天天好心情,日日好运道,白天遇财神,夜晚数钞票. 好了,废话不多说,我们先来回顾一下 C# 的版本史.后续我会对带 0 的版本号进行的简写:C# 6.0 -

  • C# 6.0的属性(Property)的语法与初始值详解

    昨晚有学点新知识,是有关C# 6.0的. 在数据库创建有一张表: CREATE TABLE [dbo].[ToolLocation] ( [ToolLocation_nbr] SMALLINT IDENTITY(1,1) NOT NULL PRIMARY KEY, [LocationName] NVARCHAR(20) NOT NULL, [Description] NVARCHAR(50) NULL, [IsActive] BIT NOT NULL DEFAULT(1) ) GO Source

  • C#6.0中10大新特性的应用和总结

    微软于2015年7月21日发布了Visual Studio 2015, .NET 2015, .NET Framework 4.6, ASP.NET 4.6, Azure SDK 2.7 for .NET, C# 6.0, F# 4.0, TypeScript 1.5, Visual Studio Android 模拟器 等重量级开发产品. 由于项目升级到了.NetFramework 4.6.1,开发工具转向了VS2015,趁机尝试下C#6.0.结果网上的教程不进人意,许久都没有更新,只好自己做

  • VS2015中C#版本6.0的新特性 你需要知道

    本文列出个人感觉比较有用的几个新功能,供大家参考,具体内容如下  注意:这些新特性只能用于VS2015及更高版本,无法在VS2013.VS2010等低版本中使用.当然,如果你不喜欢这些新的特性,仍然可以继续使用原来的用法(所以说它是新的语法糖).  1.自动属性初始化的改进(有用)  原来的用法(声明时无法同时初始化),例如: class MyClass { public int Age { get; set; } public string Name { get; set; } public

  • 探秘C# 6.0 的新特性

    C# 6.0 中的新特性 我们可以对这些新特性一个一个的进行讨论,而首先要列出 C# 6.0 中这些特性的一个清单 自动的属性初始化器 Auto Property Initializer 主构造器 Primary Consturctor 字典初始化器 Dictionary Initializer 声明表达式 Declaration Expression 静态的Using Static Using catch 块中的 await 异常过滤器 Exception Filter 用于检查NULL值的条

  • 三十分钟快速掌握C# 6.0知识点

    一.只读自动属性(Read-only auto-properties) C# 6之前我们构建只读自动属性: public string FirstName { get; private set; } public string LastName { get; private set; } 原理解析:就是编译器在生成set访问器时,它的修饰符是private,由上可知所谓的只读只是针对类外部,在类内部还是可以随意修改属性值的. C# 6中提供了真正的只读自动属性,写法如下: public stri

  • 三十分钟掌握STL-教程

    三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把它翻译出来.我没有对翻译出来的内容校验过.如果你没法在三十分钟内觉得有所收获,那么赶紧扔了它.文中我省略了很多东西.心疼那,浪费我两个晚上. 译者:kary contact:karymay@163.net STL概述 STL的一个重要特点是数据结构和算法的分离.尽管这是个简单的概念,但这种分离确实使得STL变得非常通用.例如,由于STL的sort()函数是完全通用的,你可以用它

  • 快速解决安卓7.0系统写入SD卡权限失败的问题

    如图所示,在mainfest文件中声明了SD卡的读和写权限,仍旧报错: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permi

  • 快速掌握Android屏幕的知识点

    一.首先来介绍下关于PX.PT.PPI.DPI.DP的知识 术语 说明 PX (pixel),像素,屏幕上显示数据的最基本的点 PT (point), 点1pt=1/72英寸 PPI (pixel per inch),每英寸像素数 DPI (dot per inch),每英寸点数 DP 即dip(Density-independent pixel), 设备独立像素1dp=160dpi时1px长度 其中px, pt, dp为长度单位,ppi和dpi为密度单位 密度 ldpi  mdpi hdpi

  • 快速了解vue-cli 3.0 新特性

    vue-cli 是 vue 官方团队推出的一款快速开发 vue 项目的构建工具,具有开箱即用并且提供简洁的自定义配置等功能. vue-cli 从 2.0 到 3.0 的升级有太多的新东西可以说了,但是不可能在本文中列举所有的内容,这篇文章作为一个对比 2.0 升级功能的导读,让你快速了解 3.0 更新的内容. 一.创建项目: 创建项目命令的变化. vue create my-project 3.0 版本包括默认预设配置 和 用户自定义配置. 自定义功能配置包括以下功能: TypeScript P

  • 三十分钟MySQL快速入门(图解)

    一.MySQL安装 MySQL的下载 http://dev.mysql.com/downloads/mysql/ MySQL版本选择 MySQL功能自定义选择安装 功能自定义选择 路径自定义选择 设置root用户密码 安装完成,点击MySQL Workbench 6.3 CE进入MySQL客户端 二.SQL基础 SQL语句分类 1.DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象.常用的语句关键字主要包括

  • 快速入门Vue

    一.什么是Vue? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.如果你是有经验的前端开发者,想知道 Vue.js 与其它库/框架的区别

  • vue-cli3.0 特性解读

    最近的开发项目中使用了vue-cli 3.0,使用体验可以说非常棒了,模板更加制定化,配置更加简洁.以下总结下应用过程中的一些经验. 新建项目 # 安装 npm install -g @vue/cli # 新建项目 vue create my-project # 项目启动 npm run serve # 打包 npm run build 打包后的文件,对引用资源注入了预加载(preload/prefetch),启用 PWA 插件时注入 manifest/icon 链接,并且引入(inlines)

  • 10分钟上手vue-cli 3.0 入门介绍

    环境安装 全新版本的脚手架.逼格非常高. 记住这个名字 @vue/cli ,对就是这个 你npm 或者yarn 安装就行了,先保证全局环境有它. npm install -g @vue/cli yarn add global @vue/cli 创建项目 这里对比下以前2.X之前的版本 ,新版本把插件以及模板等 移植到命令行界面了. 旧版 创建命令 2.x vue init <template-name> <project-name> 3.x vue create <proje

  • Vue 3.0 全家桶抢先体验

    序 Vue 3.0 全家桶发布内容包括: vue: Beta vue-router: Alpha vuex: Alpha vue-class-component: Alpha vue-cli: Experimental support via vue-cli-plugin-vue-next eslint-plugin-vue: Alpha vue-test-utils: Alpha vue-devtools: WIP jsx: WIP 可以看到 Vue 3.0 beta 版本是一个项目系列,包含

随机推荐