And*_*ewR 4 c# equality visual-studio
我在运行程序时使用 Visual Studio 的监视面板来调查变量。在以下代码中,test1和test2变量都添加到“监视”面板中。正如预期的那样,它们的评估结果都是true。
object a = "123";
object b = "123";
bool test1 = a == b;
bool test2 = (object)"123" == (object)"123";
Run Code Online (Sandbox Code Playgroud)
但是,如第三行所示,如果我手动添加test2变量的表达式,则其计算结果为false。
为什么同一行在 Watch 窗口中产生不同的结果?这是这里工作的某种优化吗?什么情况下可以将同一个字符串分配到不同的地址?
这里发生了一些事情,首先是当您在 C# 代码中使用字符串文字时,这些文字必须包含在已编译的程序集中,因此为了避免程序集膨胀,编译器仅输出每个唯一字符串一次,并且它们在运行时自动“实习”(请参阅: https: //learn.microsoft.com/en-us/dotnet/api/system.string.intern)。因此,给定字符串文字的所有使用都将是同一字符串实例。
\n由于上述原因,"123"代码中的所有使用在运行时都是相同的字符串实例,这就是为什么test1和test2都是true,因为您==正在执行引用相等,并且在两种情况下双方都是相同的字符串实例。
但是,当您使用监视窗口时,调试器会为表达式中的每个字符串文字创建新的字符串实例,因此它们不是同一实例,因此将它们与object\xe2\x80\x99s进行比较==会返回false。
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |