我有這段代碼可以檢查兩個變數的參考,我遇到了這種情況,這有點令人困惑:
string first = "10";
object second = 10.ToString();
dynamic third = second;
Console.WriteLine($"{first == second} {first == third}");
結果是:False True
我的第一個問題是為什么第一個和第三個參考相等?如果第三個變數等于第二個變數,那應該是False因為它們的物件參考不相等。
當我將值更改為"1"如下所示時,我感到困惑:
string first = "1";
object second = 1.ToString();
dynamic third = second;
Console.WriteLine($"{first == second} {first == third}");
那么結果就變成了:True True
為什么會這樣?
uj5u.com熱心網友回復:
我不確定為什么當您將其從 10 更改為 1 時它會更改
我相信這是一個實作細節,你不應該依賴它(將嘗試在規范中找到一些東西),但是在.NET Core 的實作中快取了一些正的個位數。以下是內部呼叫int.ToString的摘錄:UInt32ToDecStrint.ToString
// For single-digit values that are very common, especially 0 and 1, just return cached strings.
if (bufferLength == 1)
{
return s_singleDigitStringCache[value];
}
至于平等 - 請檢查:
- == 和 Equals() 之間的 C# 區別。
- .Net Framework 中的字串實習。(編譯器將實習字串文字,所以它們都將指向記憶體中的相同地址)
- 使用動態型別
升級版:
無法在規范中找到任何內容,但下一個代碼在.NET Framework和.NET 6中的行為不同(前者列印 11 次False,后者列印 10 次True和一個False):
var dict = new Dictionary<int, string>()
{
{0, "0"},
{1, "1"},
{2, "2"},
{3, "3"},
{4, "4"},
{5, "5"},
{6, "6"},
{7, "7"},
{8, "8"},
{9, "9"},
{10, "10"},
};
foreach(var kvp in dict)
{
Console.WriteLine(object.ReferenceEquals(kvp.Key.ToString(), kvp.Value));
}
uj5u.com熱心網友回復:
第一個問題的答案是因為字串相等不是基于物件參考,因為默認情況下是參考型別。
first和third都是 type string,即使只在運行時知道,所以呼叫System.String' 運算子==覆寫并且:
...反過來,呼叫靜態 Equals(String, String) 方法,該方法執行序數(區分大小寫和不區磁區域性)比較。
(來源)
至于第二個問題(編輯)...見@GuruStron 的回答。
我還要指出,Visual Studio 2022 在以下位置提供了CS0253編譯器警告first == second:
可能的意外參考比較;要進行值比較,請在右側輸入“字串”
uj5u.com熱心網友回復:
我不確定為什么當您將其從 10 更改為 1 時它會發生變化,但我認為您的問題的某些部分與 Geeks for Geeks 上的以下資訊有關:
“在 C# 4.0 中,引入了一種稱為動態型別的新型別。它用于避免編譯時型別檢查。編譯器不會在編譯時檢查動態型別變數的型別,而是這樣,編譯器在運行時獲取型別。”
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462703.html
下一篇:如何添加統一腳本設定?
