服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 10个常用特性汇总

C# 10个常用特性汇总

2022-09-23 15:27一傻小冲 C#

这篇文章主要介绍了C# 10个常用特性,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

1) async / await

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// 示例类
 
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 的时候,?? 运算符返回其左侧的值,否则返回其右侧的值:

?
1
2
3
4
5
6
7
8
9
// 可能是 null
 
var someValue = service.GetValue();
 
var defaultValue = 23
 
// 如果 someValue 是 null 的话,result 为 23
 
var result = someValue ?? defaultValue;

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

?
1
string anybody = parm1 ?? localDefault ?? globalDefault;

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

?
1
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 的一个新特性,可以通过更加高效和优雅的方式来进行字符串拼接:

?
1
2
3
4
5
6
7
// 传统方式
 
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 条件运算符使用起来如下所示:

?
1
2
3
// 如果 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)时,你可能会需要通过参数的名字来表示它:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public void PrintUserName(User currentUser)
 
{
 
  // 在重命名 currentUser 的时候,重构工具可能会遗漏在文本中的这个变量名
 
  if(currentUser == null)
 
    _logger.Error("Argument currentUser is not provided");
 
  //...
 
}

现在你可以这样来写:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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

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

?
1
2
3
4
5
6
7
8
9
public class User
 
{
 
  public Guid Id { get; } = Guid.NewGuid();
 
  // ...
 
}

使用属性初始

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

9) as / is 运算符

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

?
1
2
3
4
5
6
7
if (Person is Adult)
 
{
 
  //do stuff
 
}

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

?
1
2
3
4
5
6
7
8
9
SomeType y = x as SomeType;
 
if (y != null)
 
{
 
  //do stuff
 
}

10) yield 关键字

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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# 常用特性的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/liyichong/p/5434309.html

延伸 · 阅读

精彩推荐
  • C#winform实现创建最前端窗体的方法

    winform实现创建最前端窗体的方法

    这篇文章主要介绍了winform实现创建最前端窗体的方法,涉及C#窗体属性设置的相关技巧,非常具有实用价值,需要的朋友可以参考下...

    我心依旧7742021-10-21
  • C#c#源码的执行过程详解

    c#源码的执行过程详解

    在本篇文章中给大家详细讲述了c#源码的执行过程,对此有需要的朋友们可以学习下。...

    张三你好10582022-02-27
  • C#解析C#中的常量及如何在C#编程中定义常量

    解析C#中的常量及如何在C#编程中定义常量

    这篇文章主要介绍了C#中的常量及如何在C#编程中定义常量,是C#入门学习中的基础知识,需要的朋友可以参考下...

    C#教程网8652021-11-09
  • C#C#利用时间和随即字符串创建唯一的订单编号

    C#利用时间和随即字符串创建唯一的订单编号

    本文介绍了利用时间和随机字符串组合生成唯一订单号的示例,从而保证订单号不会重复,希望能够对大家有所帮助。...

    Darren Ji4062021-11-17
  • C#C#中构造函数和析构函数用法实例详解

    C#中构造函数和析构函数用法实例详解

    这篇文章主要介绍了C#中构造函数和析构函数用法,结合实例形式详细分析了C#中构造函数与析构函数的原理、定义、使用方法与相关注意事项,需要的朋友可...

    雨竹12672021-11-26
  • C#C# 快速高效率复制对象(表达式树)

    C# 快速高效率复制对象(表达式树)

    在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍。本文将对其解决方法进行详细介绍。下面跟着小编一起来看下吧...

    Emrys58862021-12-30
  • C#WinForm中BackgroundWorker控件用法简单实例

    WinForm中BackgroundWorker控件用法简单实例

    这篇文章主要介绍了WinForm中BackgroundWorker控件用法,以一个简单实例形式分析了BackgroundWorker控件的定义、设置及使用技巧,具有一定参考借鉴价值,需要的朋友...

    我心依旧7332021-10-20
  • C#C#编程自学之数据类型和变量一

    C#编程自学之数据类型和变量一

    本节课我们将学习C#编程语言的数据类型,数据类型可以分为值类型和引用类型,接着介绍变量的使用方法和作用域等内容,为了方便大家理解,我们还会...

    C#教程网12382021-10-29