澳门至尊网站-首页

您的位置:澳门至尊网站 > 黑客安全 > 0语法糖剖析

0语法糖剖析

2019-10-20 22:58

阅读目录:

  1. 机关属性暗中同意起首化
  2. 自行只读属性暗许早先化
  3. 表达式为基点的函数
  4. 表明式为主旨的属性(赋值)
  5. 静态类导入
  6. Null条件运算符
  7. 字符串格式化
  8. 索引最初化
  9. 丰盛过滤器when
  10. catch和finally代码块内的Await
  11. nameof表达式
  12. 扩展方法
  13. 总结

自行属性暗中认可初始化

选拔办法:

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;
    }
}
} 

 从调换代码中得以阅览编写翻译器是在实例构造函数时,开端化属性音信的。

活动只读属性暗许起头化

利用方法:

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; }
 }

出于发轫化暗中认可值实在构造函数中赋值的,所以跟属性只读无妨。

表明式为中央的函数

选择方法:

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"));

表明式为主体的性质(赋值)

应用格局:

public string Name2 => "hello world";

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

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

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

静态类导入

以此特点能够三次性导入某项目标全数静态成员,使静态成员在后头的代码中尚无项目限制一贯行使,像使用本类型下边包车型地铁静态方法一样。

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

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

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

节省了花色名称的双重编写。

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?。

假若指标不为空,则调用对象的成员取值,并赋值给变量。

字符串格式化

String.Format有个别不方便人民群众的地点是:必需输入"String.Format",使用{0}占位符、必得逐个来格式化、那点容易失误。

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

新的语法糖使用起来绝对更轻易些:

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

编写翻译器生成如下,和事先未有分化:

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

幽默的是,新格式化格局还扶持其余表达式的第一手赋值:

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

索引初阶化

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

编写翻译器生成代码:

 Dictionary<int, string> dictionary2 = new Dictionary<int, string>();
    dictionary2[7] = "seven";
    dictionary2[9] = "nine";
    dictionary2[13] = "thirteen";
    Dictionary<int, string> dictionary = dictionary2;

不行过滤器when

利用方法:

 try 
{ 
throw new ArgumentException("string error");
 }
 catch (ArgumentException e) when (myfilter(e))
 { 
Console.WriteLine(e.Message);
 }

static bool myfilter(ArgumentException e)
 { 
return false;
 }

When语法功用是:在步入到catch在此以前、验证when括号里myfilter方法再次来到的bool,假设回到true继续运维,false不走catch直接抛出十一分。

运用这些filter能够更加好的论断二个八花九裂是后续管理可能再一次抛出去。依据之前的做法,在catch块内如需重新抛出去,必要重新throw出去,那时的错误源是捕捉后在抛的,而不是原本的,有了when语法就足以向来定位到错误源。 

catch和finally代码块内的Await

Await异步管理是在c#5.0建议的,但无法在catch和finally代码块内接纳,此次在C#6.0立异上扶持了。

动用办法:

    async void Solve()
    {
        try
        {
            await HttpMethodAsync();
        }
        catch (ArgumentException e)
        {
            await HttpMethodAsync();
        }
        finally
        {
            await HttpMethodAsync();
        }
    }

编写翻译器把catch和finally的await生成到状态机里面包车型大巴MoveNext()里面。原本里面只有TaskAwaiter,以往多了2个。状态机里面包车型客车代码和原本的风流倜傥律,只是更目不暇接了下,风乐趣的童鞋能够先看下Async、Await剖析再去追究。

nameof表达式

利用办法:

string name = "";
Console.WriteLine(nameof(name));

支配台出口 "name"。

神跡会须要程序中部分成员的字符串名称,比如抛出ArgumentNullException分外的时候,想精晓ArgumentNullException类型的字符串名称,那时候就能够用nameof获取字符

串“ArgumentNullException”。今后做法都以手动复制一下,但重构改名的时候便于忘记退换字符串,使用nameof就可以防止了。

当如下使用的时候,编写翻译器会只取最终的ZipCode。

nameof(person.Address.ZipCode)

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

Console.WriteLine("name");

强盛方法

    using static System.Linq.Enumerable; //引入类型,而不是命名空间
    class Program
    {
        static void Main()
        {
            var range = Range(5, 17);                // Ok: 不是扩展方法
            var odd = Where(range, i => i % 2 == 1); // Error, 不在全局作用域里
            var even = range.Where(i => i % 2 == 0); // Ok
        }
    }

首先Enumerable是个静态类,里面是各个扩张方法,比方range。static的效应是把项目标静态成员二次性导入,rang即使是静态方法,但无法导入,例如where。

因为扩大方法固然是三个静态方法,不过语法则定它当做三个实例方法运用(照望),所以不能够在全局效率域里当静态方法用,因而var odd = Where(range, i => i % 2 == 1)是荒诞的。

唯独static却能把品种的恢弘方法作为扩张方法本人剧中人物的功能导入进去,所以var even = range.Where(i => i % 2 == 0)是ok的。

此处或者有些有一点绕,lz尽量写清楚,static新用法有2个作用:

  1. 把静态成员导入,但扩充方法比较独特、排除在外。那时static是c# 6.0的新功能。
  2. 无差距于把扩展方法的命名空间导入,所以在汇集上得以照管调用扩张方法。那是事先就部分职能,并非把扩大方法转成单纯的静态方法导入使用。

总结

见到园子里有介绍的稿子,有的时候来兴趣了,下班后装置个社区版就钻研分享下。 纵然微软直接出新东西,但都以由下至上迭代的,所以读书起来是不行快的。

 

参考

探索C#之多种导航

本文由澳门至尊网站发布于黑客安全,转载请注明出处:0语法糖剖析

关键词:

  • 上一篇:没有了
  • 下一篇:没有了