首頁 >後端開發 >C++ >為什麼某些C#和.NET角案例無視期望?

為什麼某些C#和.NET角案例無視期望?

Barbara Streisand
Barbara Streisand原創
2025-01-24 18:02:14697瀏覽

Why Do Some C# and .NET Corner Cases Defy Expectations?

探索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#的特殊處理空字符串會導致xy引用相同的對象。

無效的類型和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上調用GetType()實例

的情況 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn