在C#6.0中的新语言特性

孙广东    2015.6.5

What‘s New in C# 6:

http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Whats-New-in-C-6

Cross Platform Development系列:
http://channel9.msdn.com/Shows/CZSK-videa/Cross-Platform-Development-1-Introduction

Developer Productivity: What‘s New in C# 6系列:
http://channel9.msdn.com/Series/Developer-Productivity-Whats-New-in-C-6/01

.NET Compiler Platform ("Roslyn") 的开源源代码:
https://github.com/dotnet/roslyn

New Language Features in C# 6 文章:
https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6

在C#6.0中的新语言特性:

这篇文章介绍在C#6.0中的新语言特性。所有这些都是可在VS 2015中执行。

1、Auto-property enhancements自动属性增强

1.1自动属性的初始值设定,现在您可以添加一个自动属性的初始值设定,就像字段:

public class Customer
{
    public string First { get; set; } = "Jane";
    public string Last { get; set; } = "Doe";
}

按写的顺序执行该初始值设定项,就像普通的字段初始值设定项一样,自动属性初始值设定项也不能引用this的

内容–毕竟他们在对象之前执行初始化。

1.2 只读属性的自动属性

public class Customer
{
    public string First { get; } = "Jane";
    public string Last { get; } = "Doe";
}
大家会好奇只读属性之前是怎么进行赋值的呢?  在构造函数中:
public class Customer
{
    public string Name { get; };
    public Customer(string first, string last)
    {
        Name = first + " " + last;
    }
}

表达式--函数体成员(Expression-bodied function members):

Lambda表达式可以被声明为表达式体以及组成常规函数体块。此功能能带来同样的便利函数类型成员。

Expression bodies on method-like members:
public Point Move(int dx, int dy) => new Point(x + dx, y + dy); 
public static Complex operator +(Complex a, Complex b) => a.Add(b);
public static implicit operator string(Person p) => p.First + " " + p.Last;

public void Print() => Console.WriteLine(First + " " + Last);

Expression bodies on property-like function members:
属性和索引器:
public string Name => First + " " + Last;
public Customer this[long id] => store.LookupCustomer(id);

Using static:

该功能允许导入所有要可访问类型的静态成员,使他们无需限定即可使用后面的代码中:
using static System.Console;
using static System.Math;
using static System.DayOfWeek;
class Program
{
    static void Main()
    {
        WriteLine(Sqrt(3*3 + 4*4)); 
        WriteLine(Friday - Monday); 
    }
}

这是伟大的,当你有一组相关功能的特定域,它随时使用。System.Math将是一个常见的例子。它还允许您直接访

问单个枚举类型的值,如System.DayOfWeek的成员。

Extension methods:

扩展方法是静态方法,但应作为实例方法使用。而不是global 范围的扩展方法,使用静态特性使该类型的扩展方

法为扩展方法可用:
using static System.Linq.Enumerable; // The type, not the namespace
class Program
{
    static void Main()
    {
        var range = Range(5, 17);                // Ok: not extension
        var odd = Where(range, i => i % 2 == 1); // Error, not in scope
        var even = range.Where(i => i % 2 == 0); // Ok
    }
}

Null-conditional operators

有时代码往往要做null检查。空条件运算符允许您访问成员,只有当接收者是非null元素,否则提供一个空的结果:
int? length = customers?.Length; // null if customers is null
Customer first = customers?[0];  // null if customers is null

空条件运算符为了方便,与空合并运算符?? 一起使用:
int length = customers?.Length ?? 0; // 0 if customers is null

空条件操作符,具有短路的行为,也就是当前面的内容不为空的时候,后面紧跟着的链式成员才会被访问。
int? first = customers?[0].Orders.Count();
这个例子是本质上相当于:
int? first = (customers != null) ? customers[0].Orders.Count() : null;

当然null条件运算符本身可以被链接,如果有需要不止一次地检查null链中:
int? first = customers?[0].Orders?.Count();

请注意,?操作符后面的调用(用括号括起的参数列表)无法立即执行–这将导致太多的句法歧义。因此,直接调

用一个委托,如果它的存在,只有不工作的方式。但是,您可以通过调用委托方法:
if (predicate?.Invoke(e) ?? false) { … }

我们期望这种模式的一个非常普遍的使用将在触发事件上:
PropertyChanged?.Invoke(this, args);

String interpolation字符串插值:

String.Format 是非常灵活的和有用的,但他们使用的是有点笨拙而且容易出错。尤其不幸的是使用{0}等占位符

格式字符串,它必须单独行上提供的参数:
var s = String.Format("{0} is {1} year{{s}} old", p.Name, p.Age);

字符串插值,您可以把表达式在正确的地方,通过"holes"直接在字符串:
var s = $"{p.Name} is {p.Age} year{{s}} old";

就像String.Format ,可选的对齐方式和格式说明符可以得到:
var s = $"{p.Name,20} is {p.Age:D3} year{{s}} old";

内容可以几乎是任何表达式,甚至包括其他字符串:
var s = $"{p.Name} is {p.Age} year{(p.Age == 1 ? "" : "s")} old";

Notice that the conditional expression is parenthesized, so that the : "s" doesn’t get confused

with a format specifier.
请注意,是带圆括号的条件表达式,以便 : "s" 不混乱格式说明符。

nameof expressions:

(if x == null) throw new ArgumentNullException(nameof(x));
WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode"

Index initializers:

对象和集合初始值设定项可用于以声明方式初始化字段和属性,或给集合一组元素。使用索引器初始化字典和其

他对象不优雅。我们正在添加新对象初始值设定项的语法允许您通过任何索引器,它的新对象设置键的值:
var numbers = new Dictionary<int, string> {
    [7] = "seven",
    [9] = "nine",
    [13] = "thirteen"
};

Exception filters

功能早VB 有. F#有. 现在C#中也有.
try { … }
catch (MyException e) when (myfilter(e))
{
    …
}
private static bool Log(Exception e) { /* log it */ ; return false; }

try { … } catch (Exception e) when (Log(e)) {}

Await in catch and finally blocks:

Resource res = null;
try
{
    res = await Resource.OpenAsync(…);       // You could do this.
    …

catch(ResourceException e)
{
    await Resource.LogAsync(res, e);         // Now you can do this …
}
finally
{
    if (res != null) await res.CloseAsync(); // … and this.
}

Extension Add methods in collection initializers:
Improved overload resolution:

时间: 2024-08-04 10:36:16

在C#6.0中的新语言特性的相关文章

C# 3.0新语言特性和改进(一)

引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3.0新语言特性和改进包括: 自动属性 隐含类型局部变量 匿名类型 对象与集合初始化器 扩展方法 Lambda表达式和Lambda表达式树 1. 自动属性 自动属性可以避免我们编写实体类时声明私有变量和get/set的逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作. 在

Unity 4.0 中的新动画系统——MecAnim

分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也不例外,该版本最大变化之一就是引入了新动画系统--MecAnim,通过 MecAnim 新的动画系统,开发者在 Unity 中可以非常方便地实现角色动画.所以 Unity 4.0 的启动画面都突出了新的动画系统这一最新功能  . 这里需要说明的是,在 Unity 4.0 中,开发者还是可以使用原有的

(数据科学学习手札73)盘点pandas 1.0.0中的新特性

本文对应脚本及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 毫无疑问pandas已经成为基于Python的数据分析领域最重要的包,而就在最近,pandas终于迎来了1.0.0版本,对于pandas来说这是一次更新是里程碑式的,删除了很多旧版本中臃肿的功能,新增了一些崭新的特性,更加专注于高效实用的数据分析,本文就将针对pandas 1.0.0在笔者眼中比较重要的特性进行介绍,对于想要完整彻底了解新版

C# 8.0中的新功能

微信公众号:Fintech极客 作者为软件开发工程师,就职于金融信息科技类公司,通过CFA一级,分享计算机和金融相结合领域的技术和知识. C# 8.0中的新功能 C# 8.0已经推出来好长一段时间了, 由于公司目前主要使用的还是6.0版本,加上之前个人事情较多,一直没有总结,今天主要查看和测试微软官方文档中的内容:https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8 只读成员(Readonly members) 在st

Java8新语言特性

Java8简明指南 欢迎来到Java8简明指南.本教程将一步一步指导你通过所有新语言特性.由短而简单的代码示例,带你了解如何使用默认接口方法,lambda表达式,方法引用和可重复注解.本文的最后你会熟悉最新的API的变化如Stream,Fcuntional,Map API扩展和新的日期API. 接口的默认方法 在Java8中,利用default关键字使我们能够添加非抽象方法实现的接口.此功能也被称为扩展方法,这里是我们的第一个例子: interface Formula { double calc

STL(一)之新语言特性

新语言特性 nullptr被解释为一个void*,不同于NULL被解释为一个int 可以用auto在编译期完成自动推导,不会影响执行期的速度 新的for循环方式: for(decl : coll) { statement } rvalue reference也是一个reference,也就是说,下面这段代码是无效的: X&& foo() { X x; return std::move(x); } 关键字:expllicit意味着在对象构造期间不能有显式类型转换 关键字:noexcept用来

【译】.NET Core 3.0 中的新变化

.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web.桌面.机器学习.容器.IoT 等的版本 3.0. .NET Core 1 .NET Core 的历史可追溯到几年前,版本 1 是在 2016 年推出,旨在生成第一版开放源代码和跨平台(Windows.macOS 和 Linux)的 .NET.灵感来源于只能使用开放源代码框架的客户,以及需要在 Li

Android 6.0 系统棉花糖新的特性和功能

Get you apps ready for Android 6.0 Marshmallow! 新的功能:运行时的权限提醒,Doze(打盹模式)和备用电源,协助新技术,等等. Android 6.0Changes 伴随着新的特性和功能,Android 6.0(API level 23)在系统上和API的使用上做了一些改变. 如果我们已经发布了一款app,那么就要关注一下这些改变会不会影响应用的运行. RuntimePermissions 这是一种新的权限使用模型,用户可以在程序运行中直接管理应用

yii2.0中添加新的模块

比如现在需要添加一个新的hnews模块:复制frontend改名hnews 1.在common文件下的config下的 bootstrap.php 2.修改命名空间 在具体实例的main.config下 修改 3.主要修改的就是这两块,之后就是关联命名空间的修改了.