wig*_*igy 5 c# equals referenceequals equals-operator
我被C#中一个奇怪的"不对称"所打击,我真的不明白.请参阅以下代码:
using System;
using System.Diagnostics;
namespace EqualsExperiment
{
class Program
{
static void Main(string[] args)
{
object apple = "apple";
object orange = string.Format("{0}{1}", "ap", "ple");
Console.WriteLine("1");
Debug.Assert(apple.Equals(orange));
Console.WriteLine("2");
Debug.Assert(apple == orange);
Console.WriteLine("3");
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于所有的.NET大师来说,这可能是显而易见的,但第二个断言失败了.
在Java中,我了解到==是这里名为Object.ReferenceEquals的同义词.在C#中,我认为Object.operator ==使用Object.Equals,它是虚拟的,因此它在System.String类中被覆盖.
有人可以解释,为什么第二个断言在C#中失败?我的哪些假设不好?
该==
算不算的代名词,它是针对不同类型的限定的操作.
该==
经营者为字符串定义,然后它并实际使用的Equals
方法:
public static bool operator ==(string a, string b) {
return Equals(a, b);
}
Run Code Online (Sandbox Code Playgroud)
但是,在您的代码中,您没有在字符串上使用运算符,而是在对象上使用它,因此您获得的是==
为对象定义的运算符,用于ReferenceEquals
进行比较.
在编译时决定使用哪个运算符的重载,因此它是决定重载的变量类型,而不是变量指向的实际对象类型.
运算符被定义为静态方法,因此它们不能参与多态.所以你的第二个断言使用==
for 的定义object
(因为你的变量被声明为object
),它只测试引用相等性.如果变量被声明为string
,则将使用==
for 的重载string
,并且第二个断言将成功.
归档时间: |
|
查看次数: |
592 次 |
最近记录: |