探索C#和.NET
中的意外行為構建強大的應用需要深入了解邊緣案例。 c#和.net雖然強大,但提出了一些令人驚訝的場景,這些情況挑戰了共同的假設。讓我們檢查一些說明這些不尋常行為的例子:
new
不產生新對象
考慮這個看似簡單的代碼:
<code class="language-csharp">string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y)); // Prints True</code>
>人們可能期望new
始終為參考類型創建不同的對象。 但是,C#的特殊處理空字符串會導致x
和y
引用相同的對象。
無效的類型和NullReferenceException
此代碼段突出顯示了與無效類型的令人困惑的互動:
<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); Console.WriteLine(t.GetType()); // Throws NullReferenceException }</code>
>即使是初始化的t
,也可以調用GetType()
thr throws aNullReferenceException
。這是因為,如果T
是一種不可變性的類型(例如int?
),則隱式拳擊object
可能會導致零值,在盒裝null上調用
的情況
new
這種情況表現出了不太直觀的可能性:
約束建議
是一種帶有<code class="language-csharp">public static void CanThisHappen<T>() where T : class, new() { var instance = new T(); // new() on a ref-type; should be non-null Debug.Assert(instance != null, "How did we break the CLR?"); }</code>的參考類型。 但是,諸如遠程(例如,使用返回null的代理)之類的技術可以繞過這一期望,從而導致斷言失敗。 這突出了處理諸如遠程功能之類的高級功能時所引入的複雜性。
以上是為什麼某些C#和.NET角案例無視期望?的詳細內容。更多資訊請關注PHP中文網其他相關文章!