本文章是由機器翻譯。

C#

C# 6.0 語言預覽

作者:Mark Michaelis

由你讀到這封信,生成 — — 微軟開發者大會 — — 將要結束,開發人員將會思考如何應對所有已提交:立即擁抱,觀看輕微惶恐或暫時忽略。 為.NET / C# 開發人員,最重要的公告,無疑是釋放的下一個版本的 C# 編譯器 ("Roslyn") 作為開放原始碼。 與有關的是他們自己的語言改進。 即使你沒有打算立即採用 C# vNext — — 其中就提到一點從此和非正式的作為 C# 6.0 — — 至少,你應該意識到它的功能的注意到那些可能會使它值得跳躍中的權利。

在本文中,我將深入的什麼是在 C# 6.0 中可用的這次寫作 (2014 年 3 月) 或在現在開放原始碼位從可下載詳細資訊 roslyn.codeplex.com。 我會將這稱為我會長期 3 月預覽單個釋放。 C#-完全在編譯器沒有任何更新的 Microsoft.NET 框架或運行時的依賴中實現特定功能的這 3 月預覽。 這意味著您可以採用 C# 6.0 在您的開發而無需升級為開發或部署.NET 框架。 事實上,從本版本安裝 6.0 C# 編譯器更多安裝一個Visual Studio涉及 2013年副檔名,反過來更新MSBuild的目的檔案。

我介紹說,每個 C# 6.0 功能,可能要考慮以下事項:

  • 這樣的功能是主要是語法糖,是有合理手段在過去,編碼相同的功能 — — 一個捷徑或簡化的方法嗎? 異常篩選,例如,沒有 5.0 C# 等效,而主建構函式做。
  • 是在 3 月預覽中可用的功能嗎? 我將描述的大多數功能都可用,但有些 (如新的二進位文本) 不是。
  • 您有任何關於新的語言功能團隊的回饋嗎? 團隊是仍然相對較早在其釋放生命週期和非常有興趣聽到您的想法有關釋放 (見 msdn.com/Roslyn 的回饋說明)。

通過這類問題的思考可以説明您判斷的新功能在您自己的發展努力的意義。

索引的成員和元素初始值設定項

若要開始,請考慮在單元測試圖 1

圖 1 指派一個集合通過一個集合初始值設定項 (C# 3.0 中添加)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
// ...
[TestMethod]
public void DictionaryIndexWithoutDotDollar()
{
  Dictionary<string, string> builtInDataTypes = 
    new Dictionary<string, string>()
  {
    {"Byte", "0 to 255"},
    // ...
{"Boolean", "True or false."},
    {"Object", "An Object."},
    {"String", "A string of Unicode characters."},
    {"Decimal", "±1.0 × 10e-28 to ±7.9 × 10e28"}
  };
  Assert.AreEqual("True or false.", builtInDataTypes["Boolean"]);
}

雖然它由語法,一定程度上掩蓋圖 1 是什麼比一個名稱 / 值集合。 為此,該語法可能大大清潔:< 指數 > = < 值 >。 C# 6.0 使這成為可能通過 C# 物件初始值設定項和一種新的索引成員語法。 下面顯示了基於 int 元素初始值設定項:

var cppHelloWorldProgram = new Dictionary<int, string>
{
  [10] = "main() {",
  [20] = "    printf(\"hello, world\")",
  [30] = "}"
};
Assert.AreEqual(3, cppHelloWorldProgram.Count);

請注意,雖然此代碼使用一個整數作為索引,字典 < TKey、 TValue > 可以作為一個索引支援的任何類型,(只要它支援 IComparable < T >)。 下一個示例介紹了一個字串的索引資料類型和使用一個索引的成員初始值設定項來指定元素的值:

Dictionary<string, string> builtInDataTypes =
  new Dictionary<string, string> {
    ["Byte"] = "0 to 255",
    // ...
// Error: mixing object initializers and
    // collection initializers is invalid
    // {" Boolean", "True or false."},
    ["Object"] = "An Object.",
    ["String"] = "A string of Unicode characters.",
    ["Decimal"] = "±1.0 × 10e?28 to ±7.9 × 10e28"
  };

伴隨新索引成員初始化是一個新的 $ 運算子。 專門提供此字串索引成員語法是為了解決流行的基於字串的索引。 與這種新的語法所示圖 2,它是可能要分配更像在動態成員調用 (在 C# 4.0 中引入) 中比在前面的示例中使用的字串標記法的語法中的元素值。

圖 2 初始化集合與元素初始值設定項的一部分作為索引的成員賦值

[TestMethod]
public void DictionaryIndexWithDotDollar()
{
  Dictionary<string, string> builtInDataTypes = 
    new Dictionary<string, string> {
    $Byte = "0 to 255",   // Using indexed members in element initializers
    // ...
$Boolean = "True or false.",
    $Object = "An Object.",
    $String = "A string of Unicode characters.",
    $Decimal = "±1.0 × 10e?28 to ±7.9 × 10e28"
  };
  Assert.AreEqual("True or false.", builtInDataTypes.$Boolean);
}

若要瞭解 $ 運算子,看看 AreEqual 函式呼叫。 關於 builtInDataTypes 變數通知字典成員調用的"$Boolean"— — 即使在字典上有沒有"布林"的成員。 這種顯式成員不需要的因為 $ 運算子調用字典,相當於調用 buildInDataTypes ["布林"] 的索引的成員。

與任何基於字串的運算子,一樣是不會編譯時驗證這些字典中存在的字串的索引元素 (例如,"布林值")。 其結果是,任何有效的 C# (區分大小寫) 成員名稱可以出現在 $ 運算子之後。

要充分理解索引成員的語法,請考慮字串索引子鬆散類型化的資料的格式,例如 XML、 JSON、 CSV、 甚至資料庫查找 (假設沒有Entity Framework代碼生成魔法) 占了優勢。 圖 3,例如,演示如何使用 Newtonsoft.Json 框架的字串索引成員的便利。

圖 3 利用與 JSON 資料索引的方法

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json.Linq;
// ...
[TestMethod]
public void JsonWithDollarOperatorStringIndexers()
{
  // Additional data types eliminated for elucidation
  string jsonText = @"
    {
      'Byte':  {
        'Keyword':  'byte',
        'DotNetClassName':  'Byte',
        'Description':  'Unsigned integer',
        'Width':  '8',
        'Range':  '0 to 255'
                },
      'Boolean':  {
        'Keyword':  'bool',
        'DotNetClassName':  'Boolean',
        'Description':  'Logical Boolean type',
        'Width':  '8',
        'Range':  'True or false.'
                  },
    }";
  JObject jObject = JObject.Parse(jsonText);
  Assert.AreEqual("bool", jObject.$Boolean.$Keyword);
}

最後一點要注意,以防它已不明顯,是 $ 運算子語法只與索引的類型字串 (如詞典 < 字串,......>) 的工程。

自動屬性的初始值設定項

今天正在初始化一個類可以是繁瑣有時。 例如,考慮在內部維護私人 System.Collections.Generic.List < T > 自訂集合類型 (如佇列 < T >) 的瑣碎案件 屬性項的清單。 當具現化該集合,您必須初始化佇列,它是包含的項的清單。 但是,這樣做與屬性的合理選項需要支援欄位初始值設定項或其他建構函式的組合,幾乎增加一倍所需的代碼量。

與 C# 6.0 中,有一個語法快捷方式:自動屬性初始值設定項。 您現在可以為分配自動屬性直接,如下所示:

class Queue<T>
{
  private List<T> InternalCollection { get; } = 
    new List<T>; 
  // Queue Implementation
  // ...
}

請注意在這種情況下,該屬性是唯讀 (定義沒有 setter)。 然而,該屬性是在聲明時仍可分配。 此外支援具有二傳手的讀/寫屬性。

主建構函式

沿同樣的屬性初始值設定項,C# 6.0 提供的建構函式定義語法快捷方式。 考慮 C# 建構函式和屬性所示的驗證中的流行圖 4

圖 4 常見的建構函式模式

[Serializable]
public class Patent
{
  public Patent(string title , string yearOfPublication)
  {
    Title = title;
    YearOfPublication = yearOfPublication;
  }
  public Patent(string title, string yearOfPublication,
    IEnumerable<string> inventors)
    : this(title, yearOfPublication)
  {
    Inventors = new List<string>();
    Inventors.AddRange(inventors);
  }
  [NonSerialized] // For example
  private string _Title;
  public string Title
  {
    get
    {
      return _Title;
    }
    set
    {
      if (value == null)
      {
        throw new ArgumentNullException("Title");
      }
      _Title = value;
    }
  }
  public string YearOfPublication { get; set; }
  public List<string> Inventors { get; private set; }
  public string GetFullName()
  {
    return string.Format("{0} ({1})", Title, YearOfPublication);
  }
}

有幾點需要注意從這個常見的建構函式模式:

  1. 屬性需要驗證的事實部隊基礎的屬性欄位,必須申報。
  2. 建構函式的語法是稍微詳細與太常見公共類專利 {公共專利 (...... 重複性。
  3. "標題",在各種版本的區分大小寫,出現七次為一個相當微不足道的方案 — — 不包括驗證。
  4. 屬性的初始化需要對從建構函式中的屬性的顯式引用。

要刪除一些儀式周圍這種模式,而不會失去風味的語言,C# 6.0 引入了屬性初始值設定項和主建構函式,如中所示圖 5

圖 5 使用主建構函式

[Serializable]
public class Patent(string title, string yearOfPublication)
{
  public Patent(string title, string yearOfPublication,
    IEnumerable<string> inventors)
    :this(title, yearOfPublication)
  {
    Inventors.AddRange(inventors);
  }
  private string _Title = title;
  public string Title
  {
    get
    {
      return _Title;
    }
    set
    {
      if (value == null)
      {
        throw new ArgumentNullException("Title");
      }
      _Title = value;
    }
  }
  public string YearOfPublication { get; set; } = yearOfPublication;
  public List<string> Inventors { get; } = new List<string>();
  public string GetFullName()
  {
    return string.Format("{0} ({1})", Title, YearOfPublication);
  }
}

結合屬性初始值設定項,主建構函式語法簡化了 C# 建構函式的語法:

  • 自動屬性,是否為唯讀 (見只有 getter 具有的發明者屬性) 或讀寫,(見 YearOfPublication 屬性的 setter 和 getter),支援屬性初始化這樣初始屬性的值可以指定為屬性聲明的一部分。 語法匹配什麼使用當分配欄位的預設值在宣言 》 的時候 (例如分配 _Title,宣言 》)。
  • 預設情況下,主建構函式的參數不是容易接近的外部初始值設定項。 例如,沒有在類聲明的 yearOfPublication 欄位。
  • 當利用屬性初始值設定項在唯讀屬性 (只有 getter) 上的,沒有辦法提供的驗證。 (這是由於這樣一個事實,在底層 IL 執行時,主建構函式參數分配給支援欄位。 此外值得注意的是將定義支援欄位為唯讀 IL 中如果自動屬性只有 getter。)
  • 如果指定,主建構函式將 (和必須) 始終執行最後在建構函式鏈中 (因此,它不能有一個 this (...) 初始值設定項)。

另一個示例,考慮宣言 》 的結構,準則表明應是不可變。 下面顯示了一個基於屬性的實現 (而不是典型的公共欄位的方法):

struct Pair(string first, string second, string name)
{
  public Pair(string first, string second) : 
    this(first, second, first+"-"+second)
  {
  }
  public string First { get; } = second;
  public string Second { get; } = first;
  public string Name { get; } = name;
  // Possible equality implementation
  // ...
}

注意在對的執行,是調用主建構函式的第二個建構函式。 一般情況下,所有結構建構函式都必須 — — 直接或間接地 — — 調用主建構函式通過調用 this (...) 初始值設定項。 換句話說,這不是必要所有建構函式的主建構函式直接調用,但是在建構函式鏈的末端的主建構函式調用。 這是必要的因為它是主要的建構函式調用基建構函式初始值設定項和這樣做提供保護很少,一些常見的初始化錯誤。 (請注意,正如真正在 C# 1.0 中,它是仍有可能要具現化的結構,而調用建構函式。 這一點,例如,是該結構的陣列進行具現化時,會發生什麼。)

是否主建構函式在一個自訂的結構或類資料類型,對基建構函式的調用 (因此調用基類的預設建構函式) 隱式或顯式的這是通過調用特定的基類的建構函式。 在後一案件中,為一個自訂的異常來調用特定的 System.Exception 建構函式後主建構函式, 指定目標建構函式:

class UsbConnectionException : 
  Exception(string message, Exception innerException,
  HidDeviceInfo hidDeviceInfo) :base(message, innerException)
{
  public HidDeviceInfo HidDeviceInfo { get;  } = hidDeviceInfo;
}

一個細節需要注意的關於主建構函式涉及到避免重複,可能不相容,主要分部類的建構函式:鑒於一個分部類的多個部分,只有一個類聲明可以定義主建構函式和,同樣地,只有此主建構函式可以指定基建構函式調用。

還有一個重大警告他們要在這 3 月預覽中實現考慮在主建構函式:沒有辦法提供給主建構函式參數中的任何驗證。 並且因為屬性初始值設定項僅對自動屬性有效,有沒有辦法,要麼,在財產執行,執行驗證可能公開公共屬性 setter 的轉讓無效資料 post 實例。 目前明顯的解決方法是不使用主建構函式功能時驗證很重要。

雖然有些試探性的時刻,但有一種稱為欄位參數正在審議的相關的功能。 訪問修飾符 (如專用的字串標題) 的主建構函式參數中列入將導致要將捕獲到類範圍作為標題的名稱欄位的參數 — — 匹配的名稱和參數的大小寫)。 為此,標題都可在標題屬性或任何其他實例的類成員。 此外,訪問修飾符使整個欄位語法來指定 — — 包括其他任何修飾符 (如唯讀或甚至像這些屬性:

public class Person(
  [field: NonSerialized] private string firstName, string lastName)

請注意沒有訪問修飾符,其他 (包括特性) 不允許使用修飾符。 它是指示欄位聲明是發生在行與主建構函式的訪問修飾符。

(寫這篇文章對我當時可用的位不包括欄位參數執行,但向我保證,他們將包括在 Microsoft 生成版本中,所以你應該能夠試試你讀到這場參數的語言團隊。 鑒於相對"新鮮"的這項功能,但是,不要猶豫,提供回饋在 msdn.com/Roslyn 所以它可以考慮之前的過程是太遠的更改.)

使用語句的靜態

另一個 C# 6.0"語法糖"功能是使用靜態的介紹。 使用此功能,它是能夠消除對類型顯式引用調用的靜態方法時。 此外,使用靜態允許您介紹只在一個特定的類上的擴充方法,而不是在命名空間內的所有擴充方法。 圖 6 System.Console 上提供一個"Hello World"的例子使用的靜態。

圖 6 簡化代碼雜波背景下使用靜態

using System;
using System.Console;
public class Program
{
  private static void Main()
  {
    ConsoleColor textColor = ForegroundColor;
    try
    {
      ForegroundColor = ConsoleColor.Red;
      WriteLine("Hello, my name is Inigo Montoya...
Who are you?: ");
      ForegroundColor = ConsoleColor.Green;
      string name = ReadLine(); // Respond: No one of consequence
      ForegroundColor = ConsoleColor.Red;
      WriteLine("I must know.");
      ForegroundColor = ConsoleColor.Green;
      WriteLine("Get used to disappointment");
    }
    finally
    {
      ForegroundColor = textColor;
    }
  }
}

在此示例中,主控台限定詞是下降了共九次。 誠然,該示例做作,但即便如此,關鍵是明確。 頻繁地靜態成員 (包括屬性) 的類型首碼不會添加重要的價值和消除它更容易地讀取和寫入的代碼的結果。

雖然工作 3 月在預覽中,不使用靜態 (計畫) 第二個特點正在討論之中。 此功能是對導入特定類型的擴充方法只支援。 例如,考慮一個實用程式命名空間,包括眾多的靜態類型的擴充方法。 如果不使用靜態,導入該命名空間中的所有 (或沒有) 擴充方法。 與使用靜態的但是,很可能以精確定位到特定類型的可用的擴充方法 — — 不到更一般的命名空間。 因此,你可以叫一個LINQ標準查詢運算子通過只指定使用 System.Linq.Enumerable ; 而不是整個的 System.Linq 命名空間。

不幸的是,這種優勢並不總是可用 (至少在 3 月預覽中) 因為只有靜態類型支援使用靜態的這是為什麼,例如,有沒有使用 System.ConsoleColor 語句中的圖 6。 鑒於目前的 C# 6.0 預覽性質,是否限制將仍是仍在審查之中。 您認為如何?

聲明運算式

它並非罕見正在寫一份聲明,你找到你需要專門為該語句聲明一個變數。 考慮的兩個例子:

  • 當編碼 int。TryParse 聲明,你意識到你需要的分析結果將存儲到其中的 out 參數聲明的變數。
  • 雖然寫作語句,你會發現,需要緩存的集合 (如LINQ查詢結果),避免多次重新執行該查詢。 為了做到這一點,你打斷的寫作思維過程的語句來聲明變數。

要解決這些和類似的心煩,C# 6.0 引入了聲明運算式。 這意味著您不必限制變數聲明語句只,但可以使用它們在運算式,以及內。 圖 7 提供了兩個例子。

圖 7 聲明運算式示例

public string FormatMessage(string attributeName)
{
  string result;
  if(!
Enum.TryParse<FileAttributes>(attributeName, 
    out var attributeValue) )
  {
    result = string.Format(
      "'{0}' is not one of the possible {2} option combinations ({1})",
      attributeName, string.Join(",", string[] fileAtrributeNames =
      Enum.GetNames(typeof (FileAttributes))),
      fileAtrributeNames.Length);
  }
  else
  {
    result = string.Format("'{0}' has a corresponding value of {1}",
      attributeName, attributeValue);
  }
  return result;
}

在第一次突出顯示在圖 7,attributeValue 變數聲明與調用 Enum.TryParse,而不是事先的獨立宣言 》 中的線。 同樣,宣言 》 的檔­AttributeNames 出現在調用字串中飛上。聯接。 這使訪問以後在相同的語句的長度。 (請注意 fileAttributeNames.Length 是替代參數 {2} 在字串中。格式調用,即使它早些時候在格式字串中出現 — — 從而使 fileAttributeNames 來訪問它之前聲明.)

聲明運算式的範圍被鬆散定義為運算式出現在其中的語句的範圍。 在圖 7,attributeValue 的範圍就是 if else 語句,使其可以訪問兩個在真實的和虛假的塊的條件。 同樣,fileAttributeNames 是字串的僅在上半年的 if 語句,匹配的範圍的部分中可用。格式語句調用。

只要有可能,編譯器將使宣言 》,推斷從初始值設定項 (宣言 》 工作分配) 的資料類型的隱式類型化變數 (var) 使用。 然而,在出參數的情況下,調用目標的簽名可用於支援隱式類型化的變數,即使沒有初始值設定項。 仍然,推理並不總是可行,並且,此外,它不可能從可讀性的角度的最佳選擇。 在 TryParse 案件在圖 7,例如,var 工作,只因為指定類型參數 (FileAttributes)。 如果沒有它,var 聲明不會編譯和改為需要顯式資料類型:

Enum.TryParse(attributeName, out FileAttributes attributeValue)

在第二的聲明運算式示例中圖 7,string [] 的顯式聲明似乎作為一個陣列 (而不是清單 < 字串 > 例如) 標識的資料類型。 該指引是一般使用 var 的標準:考慮避免隱式類型化變數時,結果資料類型不是很明顯。

宣言 》 中的運算式示例圖 7 所有可以通過簡單地聲明在赴任前聲明中的變數進行編碼。

異常處理的改進

在 C# 6.0 中有兩個新的異常處理功能。 第一次是在非同步改進和等待的語法,第二是對異常篩選的支援。

當 C# 5.0 介紹非同步和等待 (上下文) 關鍵字時,開發人員獲得了相對容易的方式編寫代碼基於任務非同步模式 (TAP),則編譯器會關於費力和複雜工作的 C# 代碼轉化任務延續基礎系列。 不幸的是,團隊不能為使用 catch 內等待來自和最後塊在該版本中包括的支援。 它轉身,對於這種調用需要是比最初預期的更為普遍。 因此,C# 5.0 程式師不得不運用大量的解決方法 (如利用 awaiter 模式)。 C# 6.0 走的這一缺陷,不會和現在允許等待調用 catch 和最後塊 (他們都已經支援在 try 塊中) 內, 中所示圖 8

圖 8 等待來自一個 Catch 塊內調用

try
{
  WebRequest webRequest =
    WebRequest.Create("http://IntelliTect.com");
  WebResponse response =
    await webRequest.GetResponseAsync();
  // ...
}
catch (WebException exception)
{
  await WriteErrorToLog(exception);
}

在 C# 6.0 中的其他異常改善 — — 支援的異常篩選器 — — 帶來與其他.NET 語言,即Visual Basic的.NET 和 F # 最新的語言。 圖 9 顯示了此功能的詳細資訊。

圖 9 利用異常篩選器確定哪個捕獲到的異常

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.ComponentModel;
using System.Runtime.InteropServices;
// ...
[TestMethod][ExpectedException(typeof(Win32Exception))]
public void ExceptionFilter_DontCatchAsNativeErrorCodeIsNot42()
{
  try
  {
    throw new Win32Exception(Marshal.GetLastWin32Error());
  }
  catch (Win32Exception exception) 
    if (exception.NativeErrorCode == 0x00042)
  {
    // Only provided for elucidation (not required).
Assert.Fail("No catch expected.");
  }
}

注意補充的如果後面的 catch 運算式運算式。 在 catch 塊現在驗證,不只是類型 Win32Exception 的異常 (或從它派生),但是還驗證附加條件 — — 在此示例中的錯誤代碼的特定值。 在單元測試中圖 9,期望是在 catch 塊不會捕獲異常 — — 即使該異常類型匹配 — — 相反,異常將逃脫並由 ExpectedException 屬性上的測試方法進行處理。

請注意與的一些其他 C# 6.0 功能討論早些時候 (例如主建構函式),不同的是沒有等效的編碼 C# 6.0 以前的異常篩選器的替代方式。 直到現在,唯一的方法是到某一特定類型的捕捉所有異常、 顯式檢查異常上下文,然後重新引發異常,如果不是一個有效的異常捕獲方案的目前狀態。 換句話說,在 C# 6.0 中篩選的異常提供到目前為止是不等效地可能在 C# 中的功能。

額外的數值文本格式

雖然它還不在 3 月預覽實施,C# 6.0 將介紹一個數位分隔符號,底線 (_),作為手段分離 (十進位、 十六進位或二進位) 的數值文本中的數位。 數位可以分為不管分組有意義的適合您的方案。 例如,一個整數的最大值可分為數千人:

int number = 2_147_483_647;

結果使它更清楚地看到的一個數位,規模是否十進位、 十六進位或二進位。

該數位分隔符號是可能是為新 C# 6.0 數位的二進位檔案文字尤其有用。 雖然不需要在每個程式,但二進位文字的可用性可以提高可維護性,使用二進位邏輯或基於標誌枚舉時。 例如,請考慮所示的 FileAttribute 枚舉圖 10

圖 10 為枚舉值分配二進位文字

[Serializable][Flags]
[System.Runtime.InteropServices.ComVisible(true)]
public enum FileAttributes
{
  ReadOnly =          0b00_00_00_00_00_00_01, // 0x0001
  Hidden =            0b00_00_00_00_00_00_10, // 0x0002
  System =            0b00_00_00_00_00_01_00, // 0x0004
  Directory =         0b00_00_00_00_00_10_00, // 0x0010
  Archive =           0b00_00_00_00_01_00_00, // 0x0020
  Device =            0b00_00_00_00_10_00_00, // 0x0040
  Normal =            0b00_00_00_01_00_00_00, // 0x0080
  Temporary =         0b00_00_00_10_00_00_00, // 0x0100
  SparseFile =        0b00_00_01_00_00_00_00, // 0x0200
  ReparsePoint =      0b00_00_10_00_00_00_00, // 0x0400
  Compressed =        0b00_01_00_00_00_00_00, // 0x0800
  Offline =           0b00_10_00_00_00_00_00, // 0x1000
  NotContentIndexed = 0b01_00_00_00_00_00_00, // 0x2000
  Encrypted =         0b10_00_00_00_00_00_00  // 0x4000
}

現在,用二進位數位的文本,您可以顯示更清楚哪些標誌被設置並且不設置。 這將替換評論或編譯中所示的十六進位標記法 shift 方法計算的時間:

Encrypted = 1<<14.

(開發商急於立即嘗試此功能可以這樣做在Visual Basic.NET 3 月預覽版本。)

總結

在考慮只有這些語言的更改時,您會發現沒有什麼特別是革命或 C# 6.0 中地球破碎。 如果你把它比作其他重大的版本中,像在 C# 2.0 中,在 C# 3.0 中的LINQ或水龍頭在 C# 5.0 中,泛型 C# 6.0 是更多比一個主要的"點"釋放。 (已經作為開放原始碼發佈被編譯器的大新聞)。但只是因為它不會徹底改變你 C# 編碼,並不意味著它沒有在消除一些編碼的心煩,效率低下,一旦在日常使用的箭,你很快會授予取得真正的進展。 躋身我特別喜歡的功能是 $ 運算子 (字串索引成員)、 主建構函式 (沒有欄位的參數),使用靜態和聲明運算式。 我期望每個快速成為我編碼中的預設值,甚至有可能添加到編碼標準在某些情況下。

Mark Michaelis 是 IntelliTect 的創始人,並作為首席技術架構師和訓練師。1996 年以來,他一直是微軟最有價值球員為 C#、Visual StudioTeam System(VSTS) 和Windows SDK,和他在 2007 年被確認為 Microsoft 區域主任。 他還擔任幾個 Microsoft 軟體設計審查小組,包括 C#、 連接系統司和 VSTS。米迦勒在開發者會議上的講話和寫了許多文章和書籍,和目前正在對下一版的"基本 C#"(艾迪生-衛斯理專業)。米迦勒擁有從伊利諾伊大學的哲學和伊利諾伊理工學院電腦科學學士學位。當不粘結用他的電腦,他正忙著他的家人或另一個鐵人三項訓練。

感謝以下 Microsoft 技術專家對本文的審閱:自從 Torgersen