首頁 >後端開發 >C++ >您會在C#和.NET角案例中遇到什麼令人驚訝的行為?

您會在C#和.NET角案例中遇到什麼令人驚訝的行為?

Susan Sarandon
Susan Sarandon原創
2025-01-24 18:07:10478瀏覽

What Surprising Behaviors Can You Encounter with C# and .NET Corner Cases?

揭開意想不到的面紗:C# 和 .NET 極端案例

軟件開發常常會出現令人驚訝的曲折。 本文探討了 C# 和 .NET 中一些有趣的極端案例,即使是經驗豐富的開發人員也可能面臨這些挑戰。

讓我們從空字符串對象分配開始:

<code class="language-csharp">string x = new string(new char[0]);
string y = new string(new char[0]);
Console.WriteLine(object.ReferenceEquals(x, y)); // Outputs True</code>

這令人驚訝地輸出了 True,表明 xy 引用了同一個對象。 這是由於優化:創建空字符串重用緩存的實例。

接下來,考慮可空類型的怪癖:

<code class="language-csharp">static void Foo<T>() where T : new()
{
    T t = new T();
    Console.WriteLine(t.ToString()); // Works fine
    Console.WriteLine(t.GetHashCode()); // Works fine
    Console.WriteLine(t.Equals(t)); // Works fine
    Console.WriteLine(t.GetType()); // Throws NullReferenceException
}</code>

雖然 ToString()GetHashCode()Equals() 的行為與可空類型(如 int?)的預期相同,但調用 GetType() 會拋出 NullReferenceException。這是因為,雖然虛擬方法被重寫,但 GetType() 並未被重寫,而是對裝箱的可為空值進行操作,可能會導致空引用。

最後,讓我們檢查一下類類型的泛型約束:

<code class="language-csharp">private static void Main() {
    CanThisHappen<MyFunnyType>();
}

public static void CanThisHappen<T>() where T : class, new() {
    var instance = new T(); // new() on a ref-type; should be non-null, then
    Debug.Assert(instance != null, "How did we break the CLR?");
}</code>

雖然人們可能期望 T 的非空實例,但可以使用涉及為 null 調用返回 new() 的代理類的技術來規避這一點。這突出了 CLR 和託管代碼的運行時行為之間的複雜交互。 這些示例表明,即使看似簡單的代碼在特定場景中也可能表現出意想不到的行為,強調了徹底測試和理解 C# 和 .NET 底層機制的重要性。

以上是您會在C#和.NET角案例中遇到什麼令人驚訝的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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