价值与参考

use*_*312 2 c# reference

我应该从以下结果中做出关于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(因为它们的值相同).

Lee*_*Lee 8

你似乎有混淆的第一点是值类型,即int,float,DateTime,则==运营商值相等.对于引用类型,==是(默认情况下,见下文)引用相等.这可以解释前两个整数情况下答案的差异.

其次,Equals()测试的默认实现引用相等,而不是值相等.因此,由于它似乎MyClass没有覆盖Equals(),这解释了您的参考案例之间的答案差异.

此外,许多引用类型(例如String)覆盖==运算符以提供值相等的语义.所以你最好的选择是,直到你记住哪些类型是查找文档.

简而言之:

  • 价值类型
    • == 是值相等(对于框架类型)
    • 不是引用类型,因此引用相等是没有意义的
  • 参考类型
    • ReferenceEquals() 始终是参考平等
    • == 默认情况下是引用相等,但可以(通常是框架类型)重写以提供值相等
    • Equals() 默认情况下是引用相等,但可以(通常是框架类型)重写以提供值相等