我应该从以下结果中做出关于Equals(),ReferenceEquals()和==的决定?它们实际上产生了什么?
#region
int integer = 1;
int integer2 = integer;
bool referenceEquality = (integer == integer2);//true
bool valueEquality = integer.Equals(integer2);//true
bool valueEqualityMore = object.Equals(integer, integer2);//true
bool valueEqualityMoreMore = object.ReferenceEquals(integer, integer2);//false
#endregion
#region
int integer = 1;
int integer2 = 1;
bool referenceEquality = (integer == integer2);//true
bool valueEquality = integer.Equals(integer2);//true
bool valueEqualityMore = object.Equals(integer, integer2);//true
bool valueEqualityMoreMore = object.ReferenceEquals(integer, integer2);//false
#endregion
#region
MyClass obj = new MyClass(1, "Hello");
MyClass obj2 = obj;
bool referenceEquality = (obj == obj2);//true
bool valueEquality = obj.Equals(obj2);//true
bool valueEqualityMore = object.Equals(obj, obj2);//true
bool valueEqualityMoreMore = object.ReferenceEquals(obj, obj2);//true
#endregion
#region
MyClass obj = new MyClass(1, "Hello");
MyClass obj2 = new MyClass(1, "Hello");
bool referenceEquality = (obj == obj2);//false
bool valueEquality = obj.Equals(obj2);//false
bool valueEqualityMore = object.Equals(obj, obj2);//false
bool valueEqualityMoreMore = object.ReferenceEquals(obj, obj2);//false
#endregion
Run Code Online (Sandbox Code Playgroud)
地狱!我完全不懂.
对我来说,第一个块的referenceEquals()应该返回true.==在第二个块中应返回false(因为引用不同).并且,第4个块中的两个Equals()都应该返回true(因为它们的值相同).
你似乎有混淆的第一点是值类型,即int,float,DateTime,则==运营商值相等.对于引用类型,==是(默认情况下,见下文)引用相等.这可以解释前两个整数情况下答案的差异.
其次,Equals()测试的默认实现引用相等,而不是值相等.因此,由于它似乎MyClass没有覆盖Equals(),这解释了您的参考案例之间的答案差异.
此外,许多引用类型(例如String)覆盖==运算符以提供值相等的语义.所以你最好的选择是,直到你记住哪些类型是查找文档.
简而言之:
== 是值相等(对于框架类型)ReferenceEquals() 始终是参考平等== 默认情况下是引用相等,但可以(通常是框架类型)重写以提供值相等Equals() 默认情况下是引用相等,但可以(通常是框架类型)重写以提供值相等