我有这段代码检查两个变量的引用,我遇到了这种情况,这有点令人困惑:
string first = "10";
object second = 10.ToString();
dynamic third = second;
Console.WriteLine($"{first == second} {first == third}");
Run Code Online (Sandbox Code Playgroud)
结果是:False True
我的第一个问题是为什么第一个和第三个引用相等?如果第三个变量等于第二个变量,那应该是False因为它们的对象引用不相等。
当我将值更改为"1"如下所示时,我感到很困惑:
string first = "1";
object second = 1.ToString();
dynamic third = second;
Console.WriteLine($"{first == second} {first == third}");
Run Code Online (Sandbox Code Playgroud)
那么结果就变成了:True True
为什么会出现这种情况?
Gur*_*ron 37
\n\n我不知道为什么当你把它从 10 改为 1 时它会改变
\n
我相信这是一个实现细节,您不应该依赖它(将尝试在规范中查找某些内容),但一些正的个位数数字已缓存在 .NET Core 的实现中int.ToString。UInt32ToDecStr这是内部调用的摘录int.ToString:
// For single-digit values that are very common, especially 0 and 1, just return cached strings.\nif (bufferLength == 1)\n{\n return s_singleDigitStringCache[value];\n}\nRun Code Online (Sandbox Code Playgroud)\n至于平等 - 请检查:
\n更新:
\n无法在规范中找到任何内容,但下一个代码在.NET Framework和.NET 6中的行为有所不同(前一个代码打印 11 次False,后者打印 10 次True和 1 次False):
// For single-digit values that are very common, especially 0 and 1, just return cached strings.\nif (bufferLength == 1)\n{\n return s_singleDigitStringCache[value];\n}\nRun Code Online (Sandbox Code Playgroud)\n更新2:
\n此 PR出于性能原因引入了缓存,并在.NET Core 3.0 博客文章中的性能改进中提到:
\n\n\n在一些大型Web应用程序中,我们发现托管堆上的大量字符串都是简单的整数值,例如\xe2\x80\x9c0\xe2\x80\x9d和\xe2\x80\x9c1\xe2\x80\x9d。由于最快的代码是您根本不需要执行的代码,为什么要一遍又一遍地分配和格式化这些小数字,而我们可以只是缓存和重用结果(实际上是我们自己的字符串实习池) ?这就是 PR dotnet/coreclr#18383 所做的,为 \xe2\x80\x9c0\xe2\x80\x9d 到 \xe2\x80\x9c9\xe2\x80\ 创建一个小型的、专门的字符串缓存。 x9d,现在每当我们发现自己正在格式化一位数字整数基元时,我们都会从该缓存中获取相关字符串。
\n
var dict = new Dictionary<int, string>()\n{\n {0, "0"},\n {1, "1"},\n {2, "2"},\n {3, "3"},\n {4, "4"},\n {5, "5"},\n {6, "6"},\n {7, "7"},\n {8, "8"},\n {9, "9"},\n {10, "10"},\n};\n\nforeach(var kvp in dict)\n{\n Console.WriteLine(object.ReferenceEquals(kvp.Key.ToString(), kvp.Value));\n}\nRun Code Online (Sandbox Code Playgroud)\n| 方法 | 工具链 | 意思是 | 错误 | 标准差 | 比率 | 第0代 | 第一代 | 第2代 | 已分配 |
|---|---|---|---|---|---|---|---|---|---|
| 单个数字到字符串 | netcoreapp2.1 | 17.72纳秒 | 0.3273纳秒 | 0.3061纳秒 | 1.00 | 0.0152 | \xe2\x80\x93 | \xe2\x80\x93 | 32乙 |
| 单个数字到字符串 | netcoreapp3.0 | 11.57纳秒 | 0.1750纳秒 | 0.1551纳秒 | 0.65 | \xe2\x80\x93 | \xe2\x80\x93 | \xe2\x80\x93 | \xe2\x80\x93 |