揭開意想不到的面紗: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
,表明 x
和 y
引用了同一個對象。 這是由於優化:創建空字符串重用緩存的實例。
接下來,考慮可空類型的怪癖:
<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中文網其他相關文章!