1. 程式人生 > >C# 8,接下來會發生什麼

C# 8,接下來會發生什麼

C#從未停止發展。 從Java和C ++的模仿混合開始,選擇了它們最好的部分,這門語言就走自己的路,自己創新。隨著第8版即將釋出,讓我們來看看最後定稿草案中最強有力的候選方案。

C# 8

可以為null的引用型別

曾經,值型別不能為null,但是隨著C#2中System.Nullable<T>的引入而改變了,儘管 '?'的句法糖 渲染位元組的修飾符? 和System.Nullable<byte>可互換是最困難的。

當然,對於引用型別null總是合法的,但是這將通過擴充套件T來改變?引用型別的語法也允許:“開發人員表示引用型別的變數、引數或結果是否打算為null,並在沒有根據該意圖使用此類變數、引數和結果時提供警告”。

這使得以下情況成為可能:

class Person { //everyone has a first and a last name, but only some //people have a middle name. public string FirstName;  // Not null     public string? MiddleName; // May be null     public string LastName;    // Not null
}   假設未加修飾的引用型別T的意圖是它為non-null.。   預設介面方法
 
與Java類似的“預設方法”是引入“預設介面方法”,即與具體實現的介面中的方法。 與介面一樣,介面問題在於擴充套件它們需要實現它們的所有類也進行更改以適應更改。
 
在此提議下,實現介面IA的C類不必強制實現IA的具體方法:   interface IA {     void M() { WriteLine("IA.M"); }
}   class C : IA { }  

此功能意味著介面的未來版本和擴充套件版本不必破壞現有程式碼。

固定大小的緩衝區

這主要是一個性能增強問題,但對於那些需要打破CLR管理邊界的人來說尤為重要,比如與C DLL進行互操作時。

在這種情況下,您很可能偶然發現以下情況:

  internal unsafe struct MyBuffer {     public fixed uint Reserved[28]; //array of 28 uints }   在 'fixed'的情況下,需要固定非託管dll使用的記憶體。

然而,這個操作必須被包裝在一個 'unsafe'的上下文中,並伴隨著它,所有相關的危險。

該提議希望託管程式碼能夠與固定大小的陣列一起工作,同時還能獲得安全程式碼的好處,比如邊界檢查。'unsafe'必須離開。

您還可以通過使用MarshalAs以安全的方式與非託管程式碼進行互動,這應該是值得注意的。例如,前面的 'fixed'例子可以寫成:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)] public uint [] Reserved;   從我在 UER應用程式中廣泛使用的P/Invoke程式碼中獲取的程式碼片段,它與WinRAR的用C++編寫的unrar.dll進行互操作。 它需要一個定義為的結構:   [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] public struct OpenArchiveDataEx_template { public string ArcName; [MarshalAs(UnmanagedType.LPWStr)] public string ArcNameW; public uint OpenMode; public uint OpenResult; public string CmtBuf; public uint CmtBufSize; public uint CmtSize; public uint CmtState; public uint Flags; public IntPtr Callback; public int UserData; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)] public uint[] Reserved; ... [DllImport("unrar.dll",SetLastError=true)] public static extern IntPtr RAROpenArchiveEx(ref OpenArchiveDataEx_template OpenArchiveDataEx_instance);

在這裡,編譯器負責託管到非託管通訊,但是由於結構的分配和資料的編組而導致效能損失。'固定'然後,通過將指標傳遞給非託管結構允許直接通訊,這些內容被轉換 提高效能。 該提案以此為基礎,允許固定緩衝區也用於安全環境。

在其餘的提案中,突出的包括遞迴模式匹配,靜態代理,協變返回和非同步流。

更多資訊

C# Language Design

What's New in C# 8.0 - Mads Torgersen