1、自动属性默认初始化

使用代码

public string Id { get; set; } = "";

编译器生成的代码:

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

编译器是在实例化构造函数时初始化属性的。

2、自动只读属性默认初始化

使用代码

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

编译器生成的代码

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

只读属性的赋值只能在构造函数中进行

3、表达式为主体的函数

使用代码

private static void Test() => Console.WriteLine("Hello World!!");
Body Get(int x, int y) => new Body( + x, + y);

编译器生成的代码

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

如果函数体只有一行代码,采用表达式为主体的函数更加简洁

也支持异步函数的编写

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

4、表达式为主体的属性(赋值)

使用代码

public string Name => "Frank";

编译器生成的代码

public string Name
{
get { return "Frank"; }
}

可以看出这个属性是只读属性

5、静态类导入

使用代码

using static System.Console;
private static void ListContacts(IEnumerable<Contact> contacts)
{
foreach (var contact in contacts)
{
WriteLine("{0,-6}{1,-6}{2,-20}{3,-10}", contact.Id, contact.Name, contact.EmailAddress, contact.PhoneNum);
}
WriteLine();
}

它山之石可以攻玉,C#这次把Java的这个比较好的语法特性借鉴了过来,赞一个。

编译器生成的代码

private static void ListContacts(IEnumerable<Contact> contacts)
{
foreach (var contact in contacts)
{
Console.WriteLine("{0,-6}{1,-6}{2,-20}{3,-10}", contact.Id, contact.Name, contact.EmailAddress, contact.PhoneNum);
}
Console.WriteLine();
}

6、NULL条件运算符

使用代码

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

编译代码

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

也可以和??组合起来使用

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

还可以两个一起组合来使用

 int? contactNameLen = contact?.Name?.Length; 

这个语法糖的目的是在对象使用前检查是否为null。如果对象为空,则赋值给变量为空值,所以例子中需要一个可以为空的int类型、即int?。如果对象不为空,则调用对象的成员取值,并赋值给变量。

7、字符串格式化

String.Format有些不方便的地方是:必须输入"String.Format",使用{0}占位符、必须顺序来格式化、这点容易出错。

var contactInfo = string.Format("Id:{0} Name:{1} EmailAddr:{2} PhoneNum:{3}", contact.Id, contact.Name, contact.EmailAddress, contact.PhoneNum);

新的语法

var contactInfo2 = $"Id:{contact.Id} Name:{contact.Name} EmailAddr:{contact.EmailAddress} PhoneNum:{contact.PhoneNum}";

使用起来顺手多了,赞!

新格式化方式还支持任何表达式的直接赋值:

var contactInfo = $"Id:{contact.Id} Name:{(contact.Name.Length == 0 ? "Frank" : contact.Name)} EmailAddr:{contact.EmailAddress} PhoneNum:{contact.PhoneNum}";

C#6.0语法糖剖析(一)的更多相关文章

  1. C# 6.0语法糖剖析

    C# 6.0语法糖剖析 2016年12月16日 16:10:27 阅读数:586   版权声明:本文为博主http://www.feixueteam.net原创文章,未经博主允许不得转载. https ...

  2. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  3. C#6.0语法糖剖析(二)

    1.索引初始化 使用代码 ] = ] = ] = "thirteen"}; 编译器生成的代码 Dictionary<int, string> dictionary2 = ...

  4. C#6.0语法糖

    using System; using static System.Math;//using static,仅仅引入类中的静态方法 namespace _6._0Syntax { class Prog ...

  5. C#语法糖(Csharp Syntactic sugar)

    目录 一.C#语法糖大汇总 1. 经过简化的Property2. 经过两次变异的委托写法3. 集合类的声明4. 集合类各个项的操作5. using == try finally6. 可爱的var7. ...

  6. C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器

    今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...

  7. C#语法糖之第四篇: 扩展方法

    今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法.大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做.我先说一下我没有学习到 ...

  8. C#语法糖之开篇

    本人虽然大学不是学的计算机但是对于IT行业的热爱,依然决然进军IT行业了,自从踏进这个行业到现在也已经3年多了,从去年开发通过网上 了解博客园后深深的爱上这儿了,这里有很多牛人,通过拜读他们的代码,让 ...

  9. C#语法糖: 扩展方法(常用)

    今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法.大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做.我先说一下我没有学习到 ...

随机推荐

  1. Oracle 11g RAC客户端使用SCAN IP无法连接问题

    Oracle 版本:11.2.0.1.0 客户端:Windows Server 2003/PLSQL Developer Oracle服务器端的ip设置如下: ##公网ip 192.168.135.2 ...

  2. 牢骚与javascript中的this

    最近在看关于拖延症的一本书<拖拉一点也无妨>,后面得出结论是自己写博客大部分处于两种状态,心情很好和心情很不好的时候.因为正常状态下感觉写博客吧,是件很麻烦的事情,不如去看看电影看看漫画啥 ...

  3. Linux 学习碎片

    1.登录远程机器: ssh 远程机器用户名@远程机器IP ssh root@192.168.1.101 2.不同机器之前拷贝文件 #拷贝本机单个文件到远程服务器 scp /home/user1/tb. ...

  4. 在ubuntu下配置apache运行python脚本

    2008-12-05    常用的简单命令 sudo apt-get remove --purge apache apache2 (彻底删除)   sudo /etc/init.d/apache2 r ...

  5. Raspberry Pi --操作LED

    最简单的一个树莓派GPIO操作入门,这里记录以下 先上连接图: 卧槽.图真特么的大 用到了GPIO的GND和#18针脚,这就不上图了,红色的线接的是18针脚,暗色的线接的是GND针脚,下面上Pytho ...

  6. Windows Service插件服务开源

    WindowsService 插件服务是一个为简化NTService开发和打包程序,提供插件开发的方式进行动态加入或删除业务. 插件式服务程序的由来,在系统维护的过程中,根据企业的要求经常要进行一些周 ...

  7. GET方法传递中文参数乱码解决办法

    1.在页面中对你的URL进行编码 使用------encodeURI(你要使用的中文参数值)如:...?username"+encodeURI(“小甜甜") 2.在后台通过解码来接 ...

  8. 修复AWS上EC2损坏的sshd_config文件

    常识: AWS是没有root用户的,登陆也都是通过SSH KEY完成授权认证. 背景: 正在AWS上搭一个CI (GO),与gitlab,为了将其进行集成,需将gitlab的deploy key设置成 ...

  9. android 视频的缩略图 缓存机制和 异步加载缩略图

    在这次的工作开发项目中,涉及到一个视频缩略图的视频列表:这个在大家看来,制作视频缩略图就是两行代码就搞定的事.确实是这样的,百度一下,每个帖子都知道制作视频缩略图的方法,在这里确实也是一样的,但是我要 ...

  10. 如何在java中使用sikuli进行自动化测试

    很早之前写过一篇介绍sikuli的文章.本文简单介绍如何在java中使用sikuli进自动化测试. 图形脚本语言sikuli sikuli IDE可以完成常见的单击.右击.移动到.拖动等鼠标操作,ja ...