C# 10个常用特性汇总

1) async / await

使用 async / await 模式,可以在执行代码块操作的时候不会阻塞 UI 或者当前的线程。即使该操作被某些执行动作延迟了(比如一个 web 请求),async / await 模式也会继续执行后续的代码。

微软文档:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx

2) 对象 / 数组 / 集合的初始值设定项(initializers)

通过使用对象、数组、集合的初始值设定项,可以很容易地创建类、数组和集合的实例:

// 示例类

public class Employee {

  public string Name {get; set;}

  public DateTime StartDate {get; set;}

}

// 使用初始值设定项创建员工实例

Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()};

上述示例中的代码在单元测试中可能非常有帮助,不过在有些情况下也应该避免使用它,比如应该通过构造函数来进行类的实例化的时候。

微软文档:https://msdn.microsoft.com/zh-cn/library/bb384062.aspx

3) Lambda 表达式、谓词委托(predicates)、委托(delegates)和闭包(closures)

4) ?? – null 合并运算符(Null coalescing operator)

当表达式左侧不为 null 的时候,?? 运算符返回其左侧的值,否则返回其右侧的值:

// 可能是 null

var someValue = service.GetValue();

var defaultValue = 23

// 如果 someValue 是 null 的话,result 为 23

var result = someValue ?? defaultValue;

?? 运算符可以用于链式操作:

string anybody = parm1 ?? localDefault ?? globalDefault;

它也可以将可空类型转换为非可空类型:

var totalPurchased = PurchaseQuantities.Sum(kvp => kvp.Value ?? 0);

文档:https://msdn.microsoft.com/zh-cn/library/ms173224.aspx

5) $”{x}” – 内插字符串(String Interpolation)- C# 6

C# 6 的一个新特性,可以通过更加高效和优雅的方式来进行字符串拼接:

// 传统方式

var someString = String.Format("Some data: {0}, some more data: {1}", someVariable, someOtherVariable);

// 新的方式

var someString = $"Some data: {someVariable}, some more data: {someOtherVariable}";

也可以在大括号中写 C# 表达式,这让它变得非常强大。

6) ?. – null 条件运算符(Null-conditional operator) – C# 6

null 条件运算符使用起来如下所示:

// 如果 customer 或 customer.profile 或 customer.profile.age 为 null 的话,结果都是 null

var currentAge = customer?.profile?.age;

不再会发生 NullReferenceExceptions 了!

文档:https://msdn.microsoft.com/zh-cn/library/dn986595.aspx

7) nameof 表达式 – C# 6

新的 nameof 表达式可能看上去没那么重要,不过它确实也有其用武之地。在使用自动重构工具(比如 Resharper)时,你可能会需要通过参数的名字来表示它:

public void PrintUserName(User currentUser)

{

  // 在重命名 currentUser 的时候,重构工具可能会遗漏在文本中的这个变量名

  if(currentUser == null)

    _logger.Error("Argument currentUser is not provided");

  //...

}

现在你可以这样来写:

public void PrintUserName(User currentUser)

{

  // 重构工具不会漏掉这个

  if(currentUser == null)

    _logger.Error($"Argument {nameof(currentUser)} is not provided");

  //...

}

文档:https://msdn.microsoft.com/zh-cn/library/dn986596.aspx

8) 属性初始值设定项 – C# 6

你可以通过属性初始值设定项,在声明一个属性的时候指定一个初始值:

public class User

{ 

  public Guid Id { get; } = Guid.NewGuid(); 

  // ...

}

使用属性初始

使用属性初始值设定项的一个好处,就是你不必声明一个 setter 方法,从而使得该属性成为不可变的(immutable)。属性初始值设定项可以和 C# 6 的主构造函数(Primary Constructor)语法配合使用。(译者注:Primary Constructor 语法可以让你在定义一个类的同时,在类名之后立即指定一个带参数的构造函数)

9) as / is 运算符

is 运算符用来判断一个实例是否是特定类型的,比如你想看一下类型转换是否是可行的:

if (Person is Adult)

{

  //do stuff

}

as 运算符会试图将某个对象转换为某个特定类的实例。如果无法转换的话会返回 null:

SomeType y = x as SomeType;

if (y != null)

{

  //do stuff

}

10) yield 关键字

你可以通过 yield 关键字来返回 IEnumerable 接口的数据项。下面的示例会返回 2 的次方(比如直到 8 次方:2、4、8、16、32、64、128、256):

public static IEnumerable<int> Power(int number, int exponent)

{

  int result = 1;

  for (int i = 0; i < exponent; i++)

  {

   result = result * number;

   yield return result;

  }

}

如果使用得当的话,yield 会变得非常强大。它使得你延迟生成序列中的对象,比如当系统不需要枚举整个集合的时候,可以按需停止。

以上就是C# 10个常用特性汇总的详细内容,更多关于C# 常用特性的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅谈C# 9.0 新特性之只读属性和记录

    大家好,这是 C# 9.0 新特性系列的第 4 篇文章. 熟悉函数式编程的童鞋一定对"只读"这个词不陌生.为了保证代码块自身的"纯洁",函数式编程是不能随便"弄脏"外来事物(参数.变量等)的,所以"只读"对函数式编程非常重要. 为了丰富 C# 对函数式编程支持,较新的 C# 版本引入了一些很有用的新特性.比如 C# 8 中就对 struct 类型的方法增加了 readonly 修饰符支持,被 readonly 修饰的方法是不能

  • C# XML序列化方法及常用特性总结分析

    本文实例总结了C# XML序列化方法及常用特性.分享给大家供大家参考,具体如下: C#对象XML序列化(一):序列化方法和常用特性 .Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象.Serializer的使用比较直观,需要多注意的是XML序列化相关的Attribute,怎么把这些attribute应用到我们的对象,以及对象公共属性上面去,生成满足预期格式的XML. 这里列出了最

  • c# Newtonsoft 六个值得使用的特性(下)

    一:讲故事 上一篇介绍的 6 个特性从园子里的反馈来看效果不错,那这一篇就再带来 6 个特性同大家一起欣赏. 二:特性分析 1. 像弱类型语言一样解析 json 大家都知道弱类型的语言有很多,如: nodejs,python,php,它们有一个

  • c# 9.0新特性nint和Pattern matching的使用方法

    一:背景 1. 讲故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多头还是空头,起码还是对它抱有一种极为关注的态度,所以我的这个系列还得跟,那就继续开撸吧,今天继续带来两个新特性,更多新特性列表,请大家关注:新特性预览 二:新特性研究 1. Native ints 从字面上看貌似是什么原生类型ints,有点莫名其妙,还是看一看Issues上举得例子吧: Summar

  • 关于C# 4.0新特性“缺省参数”的实现详解

    前言 C#4.0关于缺省参数的新特性,相信大家都不会陌生.所谓缺省参数,顾名思义,就是在声明方法的某个参数的时候为之指定一个默认值,在调用该方法的时候如果采用该默认值,你就无须指定该参数.和很多语言层面特性(语法糖)的实现一样,缺省参数也是编译器为我们玩的一个小花招.缺省参数最终体现为两个特殊的自定义特性OptionalAttribute和DefaultParameterValueAttribute . 目录 一.缺省参数的用法 二.实现缺省参数的两个特性:OptionalAttribute和D

  • c# Newtonsoft 六个值得使用的特性(上)

    一:讲故事 看完官方文档,阅读了一些 Newtonsoft 源码,对它有了新的认识,先总结 六个超经典又实用的特性,同大家一起分享,废话不多说,快来一起看看吧~~~ 二:特性分析 1. 代码格式化 如果你直接使用 JsonConvert.SerializeObject的话,默认情况下所有的json是挤压在一块的,特别不方便阅读,如下所示: static void Main(string[] args) { var reportModel = new ReportModel() { Product

  • 浅析C# 9.0 新特性之 Lambda 弃元参数

    大家好,这是 C# 9.0 新特性短系列的第 5 篇文章. 弃元(Discards) 是在 C# 7.0 的时候开始支持的,它是一种人为丢弃不使用的临时虚拟变量.语法上它是用来赋值的,但它却不被分配存储空间,即没有值,所以不能从中读取值.弃元用 _(下划线) 表示,下划线是一个关键字,只能赋值,不能读取,例如: 在 C# 7.0 中,弃元的使用场景主要有下面四种: 元组和对象的解构 使用 is 和 switch 的模式匹配 对具有 out 参数的方法的调用 作用域内独立使用场景 针对这几个场景,

  • 浅谈C#9.0新特性之参数非空检查简化

    参数非空检查是缩写类库很常见的操作,在一个方法中要求参数不能为空,否则抛出相应的异常.比如: public static string HashPassword(string password) { if(password is null) { throw new ArgumentNullException(nameof(password)); } ... } 当异常发生时,调用者很容易知道是什么问题.如果不加这个检查,可能就会由系统抛出未将对象引用为实例之类的错误,这不利于调用者诊断错误. 由

  • C# 9.0 新特性之模式匹配简化的实现

    记得在 MS Build 2020 大会上,C# 语言开发项目经理 Mads Torgersen 宣称 C# 9.0 将会随着 .NET 5 在今年 11 月份正式发布.目前 .NET 5 已经到了 Preview 5 阶段了,C# 9.0 也已经初具规模.忍不住激动的心情,暂停更新<C#.NET 拾遗补漏>系列几天,先要和大家分享一下我了解到的 C# 9.0 的新特性.由于新特性比较多,所以会分成几篇来讲.这是第一篇,专讲模式匹配这个特性的简化. 模式匹配(Pattern Matching)

  • C# 10个常用特性汇总

    1) async / await 使用 async / await 模式,可以在执行代码块操作的时候不会阻塞 UI 或者当前的线程.即使该操作被某些执行动作延迟了(比如一个 web 请求),async / await 模式也会继续执行后续的代码. 微软文档:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 2) 对象 / 数组 / 集合的初始值设定项(initializers) 通过使用对象.数组.集合的初始值设定项,可以很容易地创建类

  • 前端常用正则表达式汇总

    前言 正则这东西吧,感觉是开发的都会接触到一些.. 那些所谓的基础语法就不说了哈,一搜一大把,来点实际的. 我这里就分享下我工作中汇总和遇到的,希望对一些小伙伴有些许帮助哈!! 正则汇总 匹配URL const regexURL = /((https?|ftp)?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi; // 这条正则可以匹配这么一坨格式的url //ww

  • 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("

  • Visual Studio 2017 针对移动开发的新特性汇总

    Visual Studio是世界上最好的IDE之一,如果是 .NET世界,那就没有之一了(^_^),而最近推出的Visual Studio 2017在移动平台方面更是加强了这一点.这个版本包含了一些非常棒的功能,包括实时单元测试.新的重构.代码提示.C#7.0的支持,以及帮助移动开发人员构建更好的移动应用程序的功能. 下面,就让我们一起来看看Visual Studio 2017中有哪些功能使得移动开发变得更加容易. Visual Studio 2017的安装体验有所提升 Visual Studi

  • ASP.NET程序中常用代码汇总

    1. 打开新的窗口并传送参数: //传送参数: response.write("<script>window.open('*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="++"')</script>") //接收参数: string a = Request.QueryString("id"); string b = Request.QueryS

  • Eclipse中常用快捷键汇总

    Eclipse是一个很强大的.免费的开发平台,Java常用此工具来做开发.快捷键作为提升开发效率的必备手段,有必要了解一下,下面介绍了常用的快捷键. Eclipse中的快捷键 1.补全代码的声明:alt + / 2.快速修复: ctrl + 1 3.使用单行注释:ctrl + / 4.使用多行注释: ctrl + shift + / 5.取消多行注释:ctrl + shift + \ 6.复制指定行的代码:ctrl + alt + down 或 ctrl + alt + up 7.删除指定行的代

  • docker常用命令汇总

    docker安装 1.要求:linux内核在3.10及其以上 内核版本查看: uname -r 内核升级: yun update 2.docker安装 yum install docker 3.docker版本查看 docker -v 4.docker启动 systemctl start docker 5.docker停止 systemctl stop docker 6.设置开机启动docker systemctl enable docker docker卸载 查看软件安装 rpm -qa |g

  • c# 常用框架汇总

    Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象.让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换. Math.NET http://www.mathdotnet.com/ Math.NET的目标是为提供一款自身包含清晰框

  • Flutter 常用插件汇总

    DIO网络请求框架 提起 Flutter 的网络框架,就不得不提 DIO,而且令人自豪的是 DIO 是国人开发的哦!DIO 作为一个网络框架实现了全部的网络请求,包括 GET.POST.PUT.PATCH.DELETE等,同时还支持拦截器,错误捕获和文件下载.借助 DIO,可以快速完成 Flutter App 与后端的数据交互.示例代码如下: Response response; var dio = Dio(); response = await dio.get('/test?id=12&nam

随机推荐