C#6.0语法糖剖析(一)
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语法糖剖析(一)的更多相关文章
- C# 6.0语法糖剖析
C# 6.0语法糖剖析 2016年12月16日 16:10:27 阅读数:586 版权声明:本文为博主http://www.feixueteam.net原创文章,未经博主允许不得转载. https ...
- 探索C#之6.0语法糖剖析
阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...
- C#6.0语法糖剖析(二)
1.索引初始化 使用代码 ] = ] = ] = "thirteen"}; 编译器生成的代码 Dictionary<int, string> dictionary2 = ...
- C#6.0语法糖
using System; using static System.Math;//using static,仅仅引入类中的静态方法 namespace _6._0Syntax { class Prog ...
- C#语法糖(Csharp Syntactic sugar)
目录 一.C#语法糖大汇总 1. 经过简化的Property2. 经过两次变异的委托写法3. 集合类的声明4. 集合类各个项的操作5. using == try finally6. 可爱的var7. ...
- C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器
今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...
- C#语法糖之第四篇: 扩展方法
今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法.大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做.我先说一下我没有学习到 ...
- C#语法糖之开篇
本人虽然大学不是学的计算机但是对于IT行业的热爱,依然决然进军IT行业了,自从踏进这个行业到现在也已经3年多了,从去年开发通过网上 了解博客园后深深的爱上这儿了,这里有很多牛人,通过拜读他们的代码,让 ...
- C#语法糖: 扩展方法(常用)
今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法.大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做.我先说一下我没有学习到 ...
随机推荐
- VS2012文本编辑器鼠标不能滚动
- swift 附属脚本
附属脚本是访问对象,集合或序列的快捷方式 struct STest{ let constValue:Int subscript(count:Int)->Int{ return count*con ...
- iOS开源项目教程大合集
UI篇 1.MMDrawerController http://www.cnblogs.com/shangdahao/p/3142204.html 2.SVPullToRefresh http://w ...
- Win7“当前用户没有安装Microsoft Office"
故障:在win7 win10系统已安装office2007~但打开word excel应用程序时提示"当前用户没有安装Microsoft Office". 原因:office200 ...
- Qt编写自定义控件大全
最新版可执行文件 http://pan.baidu.com/s/1i491FQP 不定期增加控件及修正BUG和改进算法. 总图: 1:动画按钮 * 1:可设置显示的图像和底部的文字 * 2:可设置普通 ...
- python watchdog
监视文件变更 #!/usr/bin/python # -*- coding:UTF-8 -*- import time from watchdog.observers import Observer ...
- CommonJS 模块规范 1.1.1
本规范致力于描述一类可以同时适用于客户端和服务器端的模块系统.该系统中的模块拥有自己的作用域,可以从其他模块导入单例对象,或者对外提供 API. Require require 是一个函数对象. re ...
- 什么是作用域链,什么是原型链,它们的区别,在js中它们具体指什么?
什么是作用域链,什么是原型链. 作用域是针对变量的,比如我们创建了一个函数,函数里面又包含了一个函数,那么现在就有三个作用域 全局作用域==>函数1作用域==>函数2作用域 作用域的特点就 ...
- DDD:两篇不错的文章
文章列表 Coding for Domain-Driven Design: Tips for Data-Focused Devs. Strengthening your domain: Aggrega ...
- ECMASCRIPT 6中字符串的新特性
本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...