![](/img/trans.png)
[英]Nothing equals String.Empty, null does not equal String.Empty, what am I missing here?
[英]Can string.Empty ever be equal to null?
我發現了一個用C#
編寫的開源操作系統代碼,我看到了以下檢查:
if (String.Empty == null)
throw new Exception("Compiler didn't initialize System.String.Empty!");
它對我來說看起來像一個毫無意義的檢查但是因為我在操作系統的源代碼中看到它,我以為我可能會遺漏一些東西。 string.Empty
可能為null嗎?
注意:如果您有興趣,請參閱以下源代碼
根據MSDN :
String .Empty == ""
來自referencesource.microsoft.com :
// The Empty constant holds the empty string value. It is initialized by the EE during startup.
// It is treated as intrinsic by the JIT as so the static constructor would never run.
// Leaving it uninitialized would confuse debuggers.
. . . .
public static readonly String Empty;
(EE可能意味着“ 執行引擎 ”。)
當然,可能是某些CLR實現不遵循此規則,或者有人設法使用Reflection來破解它。 但如果我們考慮這樣的情況,那么答案就應該接近“一切皆有可能”。
它可以? 是。
這行代碼會告訴你它是不是? 不可靠。 一旦打破運行時的不變量,所有代碼的行為就變得不可靠。
這條線更有可能成功執行測試,但仍然沒有保證:
if (ReferenceEquals(null, typeof(string).GetField("Empty").GetValue(null)))
在正常環境中,這可能(或更好地說應該 )永遠不會出現這種情況(除了運行時中的錯誤,或者有人反思),因為String.Empty
被指定為等於""
。
由於您所指的項目(AtomOS)正在使用IL2CPU將IL代碼轉換為本機機器指令,因此可能會用於捕獲IL2CPU中的錯誤。
根據標准,不, string.Empty
永遠不應為null。
但是,這可能使用自定義C#編譯器來編寫操作系統。 我認為這個測試在單元測試中會更好,但那只是我。
在正常的應用程序中,no,String.Empty永遠不能為null。
異常消息似乎表明開發人員認為編譯器是初始化AtomOS的String.Empty,但這沒有意義...... String.Empty在運行時由靜態構造函數初始化,而不是在編譯時。
我不知道在AtomOS中String.Empty是否可能為null,但一般情況下,除非System.String的運行時或實現是錯誤的,否則它是不可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.