探索C#之6.0语法糖剖析

2019-12-12 08:12栏目:编程
TAG:

阅读目录:

自动属性暗许开端化

运用方式:

public string Name { get; set; } = "Hello World";

编写翻译器生成代码:

public class Customer 
{
 [CompilerGenerated] 
private string kBackingField = "hello world"; 
public Customer() 
{ 
this.kBackingField = "hello world"; 
}

public string Name
{
    [CompilerGenerated]
    get
    {
        return this.<Name>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<Name>k__BackingField = value;
    }
}
}

bob体育app,从变化代码中能够看看编写翻译器是在实例化布局函数时,伊始化属性音信的。

  1. 活动属性私下认可开首化
  2. 自动只读属性暗中认可最早化
  3. 表明式为核心的函数
  4. 表明式为重心的天性(赋值卡塔尔(英语:State of Qatar)
  5. bob体育平台,静态类导入
  6. Null条件运算符
  7. 字符串格式化
  8. 索引早先化
  9. 丰裕过滤器when
  10. catch和finally代码块内的Await
  11. nameof表达式
  12. 举一反三方法
  13. 总结

机动只读属性暗中同意起先化

选用方法:

public string Name1 {get;} = "hello world";

编写翻译器生成代码:

public class Customer 
{
 [CompilerGenerated] 
private string kBackingField = "hello world"; 
public Customer() 
{ 
this.kBackingField = "hello world"; 
}

public string Name
{
    [CompilerGenerated]
    get
    {
        return this.<Name>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<Name>k__BackingField = value;
    }
}
}

从调换的代码中也足以见到编译器是在实例化布局函数时,初叶化属性音讯的。

自行属性暗中认可开首化

行使办法:

public string Name { get; set; } = "hello world";

为了便利驾驭使用2.0语法展现,编写翻译器生成代码如下:

 public class Customer 
{
 [CompilerGenerated] 
private string kBackingField = "hello world"; 
public Customer() 
{ 
this.kBackingField = "hello world"; 
}

public string Name
{
    [CompilerGenerated]
    get
    {
        return this.<Name>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<Name>k__BackingField = value;
    }
}
} 

 从转变代码中能够见见编译器是在实例构造函数时,初阶化属性讯息的。

表明式为主体的函数

应用方式:

Body Get(int x, int y) => new Body(1 + x, 2 + y);

编写翻译器生成代码:

private Program.Body Get(int x, int y)
{
      return new Program.Body(1+x, 2+y);
}

从变化的代码中能够看见简化了单选方法的编纂,省去写大括号的武术。
相同的时候也支撑未有重回值的写法:

void OutPut(int x, int y) => Console.WriteLine("hello, world");

也支撑异步函数的编纂:

async void OutPut(int x, int y) => await new Task(() => Console.WriteLine("hello world"));

机关只读属性暗许开头化

应用方式:

public string Name1 { get; } = "hello world";

编写翻译器生成代码如下:

[CompilerGenerated] 
private readonly string kBackingField; 
public Customer() 
{
 this.kBackingField = "hello world";
 } 
public string Name1 
{
 [CompilerGenerated] 
get { return this.k__BackingField; }
 }

出于开首化默许值实在布局函数中赋值的,所以跟属性只读无妨。

表达式为大旨的品质(赋值)

采取方法:

public string Name2 => "hello world";

编写翻译器生成代码如下:

public string Name2
{
     get { return "hello world"; }
}

编写翻译器只生成了个只读属性

表达式为重心的函数

运用方法:

Body Get(int x, int y) => new Body(1 + x, 2 + y);

编译器生成如下:

private Program.Body Get(int x, int y)
{
    return new Program.Body(1 + x, 2 + y);
}

简化了单行方法的编排,省去写大括号的功力。

与此同期帮忙未有重返值的写法: 

void OutPut(int x, int y) => Console.WriteLine("hello world");

也帮助异步函数的编排:

async void OutPut(int x, int y) => await new Task(() => Console.WriteLine("hello wolrd"));

静态类导入

本条比比较容易于理解,正是二次性导入某项指标富有静态成员,然后在后头的代码中央行政机构接使用,比方:

using static System.Console;
class Program
{
      static void Main(string[] args}
      {
            WriteLine("hello world");
      }
}

表达式为中央的习性(赋值卡塔尔

选取方式:

public string Name2 => "hello world";

编译器生成代码如下:

public string Name2 
{ 
get { return "mushroomsir"; }
 }

编写翻译器只生成了个只读属性。

Null 条件运算符

采取办法:

Customer cust = new Customer();
if (cust != null)
{
      string name = cust.Name;
}

等同于:

Customer cust = new Customer();
string name = cust?.Name;

能够和??组合起来使用:

if (customer?.Face()?? false)

仍可以够2个协同用

int? Length = customer?.Name?.Length;

本条语法糖指标是在对象使用前检查是还是不是为null,假如指标为空,则赋值给变量为宿舍,所以例子中须要二个方可为空的Int类型,即int?
借使目的不为空,则调用对象的积极分子取舍,并赋值给变量

静态类导入

这一个特点能够二遍性导入某项指标富有静态成员,使静态成员在末端的代码中从未项目节制一直利用,像使用本类型上面包车型地铁静态方法雷同。

using static System.Console;
 class Program 
{ 
static void Main(string[] args) 
{
 WriteLine("hello wolrd"); 
}
}

编写翻译器生成代码如下:

private static void Main(string[] args)
 {
 Console.WriteLine("hello wolrd"); 
}

节约了类外可以称作的再次编写。

字符串格式化

在上面包车型大巴例子中,String.Format 某个不便于的位置是:必得输入“String.Format", 使用{0}点位符,必需按梯次来格式化,这一点比较简单失误:

var s = String.Format("{0} is {1} year old", p.Name, p.Age);

新的语法糖能够这么使用:

var s = $"{p.Name} is {p.Age} year old";

正如风趣的是,新格式方法还援助任何表明式的平昔赋值:

var s = $"{p.Name} is {p.Age} year{(p.Age == 1 ? "" : "s")} old";

Null条件运算符

行使方法:

Customer customer = new Customer();
 string name3 = customer?.Name;

等同于:

Customer customer = new Customer();
if (customer1 != null)
{
    string name = customer1.Name;
}

能够和??组合起来使用:

if (customer?.Face2()??false)

还是能够2个一齐用:

int? Length = customer?.Name?.Length;

也得以方法调用:

customer?.Face();

以此语法糖的目标是在目的使用前检查是还是不是为null。假使目的为空,则赋值给变量为空值,所以例子中须要贰个足以为空的int类型、即int?。

风流浪漫经目的不为空,则调用对象的成员取值,并赋值给变量。

目录的起先化

接受List时,就算能够通过下边包车型客车法子书写,可以编译通过,但要么会抛非凡,使用形式:

var numbers = new List<string> { [7] = "seven", [9] ="nine", [13] ="thirteen"};

编写翻译器生成代码:

List list = new List(); 
list[7] = "seven";
 list[9] = "nine"; 
list[13] = "thirteen";

Dictionary 能够推行,因为两岸内部索引机制不均等:

var numbers = new Dictionary<int, string> {[7] = "seven",[9] = "nine",[13] = "thirteen";

版权声明:本文由bob体育app发布于编程,转载请注明出处:探索C#之6.0语法糖剖析