C# C:通过值和引用比较变量
我有一点困惑,当我们比较like==或equal函数时,两者的作用是相同的。这里有一个非常基本的问题 查看我的程序完整代码 我知道,这种检查x==y是否基于值,但当我使用Equals函数时,我看到Equals也像==运算符一样工作……对吗 如何检查参考资料C# C:通过值和引用比较变量,c#,C#,我有一点困惑,当我们比较like==或equal函数时,两者的作用是相同的。这里有一个非常基本的问题 查看我的程序完整代码 我知道,这种检查x==y是否基于值,但当我使用Equals函数时,我看到Equals也像==运算符一样工作……对吗 如何检查参考资料 if (object.ReferenceEquals(x,y)) Console.WriteLine("ref is same"); else Console.WriteLine("ref is not same"); 在本
if (object.ReferenceEquals(x,y))
Console.WriteLine("ref is same");
else
Console.WriteLine("ref is not same");
在本例中,我看到else部分执行……。为什么是因为为x和y分配了不同的内存
请参阅更多有关字符串引用检查的信息
在这种情况下,s1和s2 ref发现相同,我不清楚,因为s1和s2 ref应该不同,因为两者是不同的变量,所以s1和s2 ref检查如何变得相同
我想知道了解值和引用是否相同的最佳过程是什么,我们使用的数据类型可能是字符串、整数或浮点等。
请有人帮我理解这一点。谢谢
我知道,如果x==y,这种检查是基于值的
那是假的。它将使用相关类型决定实现的任何平等实现,无论是值比较还是参考比较
Equals也是类似于==运算符的工作方式
严格来说,这是不一样的。Equals方法使用第一个操作数的实际运行时类型来确定要使用哪种类型的实现,而==运算符使用两个操作数的编译时类型来确定要使用哪种实现。此外,不同的类型可以提供它们想要的任何实现,尽管为同一类型提供两种不同的行为是一个非常糟糕的想法
为什么是因为为x和y分配了不同的内存
由于x和y是值类型,并且您要将它们传递给需要对象参数的方法,因此这两个都将被装箱,并且每个都将被装箱到单独的位置,因此它们将具有不同的引用。当任何一个参数都是值类型的变量时,调用object.ReferenceEquals都没有意义。它永远是假的
在这种情况下,s1和s2 ref发现相同,我不清楚,因为s1和s2 ref应该不同,因为两者是不同的变量,所以s1和s2 ref检查如何变得相同
这两个字符串文字将使用相同的对象引用作为优化,这称为字符串插入。在.NET中,字符串被插入。这意味着,如果您有两个具有相同值的不同字符串变量,CLR可能会决定让它们指向相同的内存地址。这允许更有效的资源管理,因为它会消耗更少的内存。@DarinDimitrov:我认为CLR不会单方面决定这样做。如果它是一个编译时常量,则由语言保证。否则,只有当你打电话给实习生时,才会发生这种情况。当提到你自己时,请使用大写字母,并在句首使用大写字母。请不要使用txtspk,因为你打字真的不太麻烦。我试图修复这个问题,但在并行编辑中它被覆盖了,我不会再修复它。Equals和==依赖于每个类的实现,也就是说。NET Equals for字符串首先检查引用是否相等,如果内容相等,则检查失败@琼斯杰,说得好,我被纠正了。实际上,只有编译时常量是自动插入的。
if (object.ReferenceEquals(x,y))
Console.WriteLine("ref is same");
else
Console.WriteLine("ref is not same");
if (object.ReferenceEquals(s1, s2))
Console.WriteLine("ref is same");
else
Console.WriteLine("ref is not same");