我得到一个类的一个实例不等于同一类的另一个实例,即使两个实例都包含属性,并且实例的字段包含相同的值。例如,在下面的代码中,即使TestClass
和TestValue01
属性的两个TestValue02
实例具有相同的值,比较也将等于false,而"Boooo!"
将等于被打印。
static void Main(string[] args)
{
TestClass testClassInstance01 = new TestClass(1, 1);
TestClass testClassInstance02 = new TestClass(1, 1);
if (testClassInstance01 == testClassInstance02)
{
Console.WriteLine("Woohoo!");
}
else
{
Console.WriteLine("Boooo!");
}
}
class TestClass
{
public int TestValue01 { get; private set; }
public int TestValue02 { get; private set; }
public TestClass(int testValue01, int testValue02)
{
TestValue01 = testValue01;
TestValue02 = testValue02;
}
}
是否有可能迫使这种比较等同于true?
显而易见,要做的是使属性值相同,如下所示,但是我很好奇是否可以避免。
if (testClassInstance01.TestValue01 == testClassInstance02.TestValue01
&& testClassInstance01.TestValue02 == testClassInstance02.TestValue02)
{
Console.WriteLine("Woohoo!");
}
else
{
Console.WriteLine("Boooo!");
}
出于完整性考虑,我一直在寻找operator overloading
。这是我需要此示例返回true的代码:
class TestClass
{
public int TestValue01 { get; private set; }
public int TestValue02 { get; private set; }
public TestClass(int testValue01, int testValue02)
{
TestValue01 = testValue01;
TestValue02 = testValue02;
}
public static bool operator==(TestClass tc01, TestClass tc02)
{
return tc01.TestValue01 == tc02.TestValue01 && tc01.TestValue02 == tc02.TestValue02;
}
public static bool operator!=(TestClass tc01, TestClass tc02)
{
return tc01.TestValue01 != tc02.TestValue01 || tc01.TestValue02 != tc02.TestValue02;
}
}
答案 0 :(得分:1)
重载==运算符。我有一段时间没做C#了,我有点生疏了,但是您可以看看运算符重载来定义这种行为
答案 1 :(得分:1)
Marij Khans的回答基本上是正确的。在不重载运算符的情况下,ReferenceEquals(object,object)在应用于类实例时用于'=='和'!=',并且因为在您的示例中您比较两个实例,所以结果为'false'。完整的解决方案如下所示:
from graphviz import Digraph
import io
dot = Digraph(comment='The Round Table', format='gv')
dot.node('A', 'King Arthur')
data = io.StringIO()
print("writing")
data.write( dot.pipe().decode('utf-8') )
print("reading")
data.seek(0)
print(data.read())
# print(data.getvalue())
data.close()
除了运算符'=='和'!='的重载之外,IEquatable接口的实现还确保比较始终按预期工作,即使在用作字典或模式a.Equals(b)的键时也是如此用过的。为了在以此类的实例为键搜索大型集合时提高速度,您甚至可能想要实现GetHashCode(),但这要求生成哈希码时使用的值必须是只读的(即,删除属性的setter,因此只能在构造函数中进行设置。