在C#6.0中的新語言特性

來源:互聯網
上載者:User

標籤:unity   unity3d   3d   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:


在C#6.0中的新語言特性

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.