[英]C# == is different in value types and reference types?
在Java中,引用类型有“==”和“等于”运算符,值类型有“==”。 对于引用类型,“==”表示两个对象都指向同一位置,“等于”表示它们的值相同。 C#是否有值类型和引用类型的类似运算符?
那么,==可以重载参考类型。 例如:
string a = new string('x', 10);
string b = new string('x', 10);
Console.WriteLine(a == b); // True
Console.WriteLine(Object.ReferenceEquals(a, b)); // False
除非它被重载,否则==表示“引用相等”,也就是引用类型的“对象标识”。 (正如Marc所说,你可以覆盖Equals
而不会超载==。)
对于值类型,您必须重载==否则C#编译器将不允许您使用它进行比较。 .NET本身将提供Equals
的实现,它通常做正确的事情,但有时候很慢 - 在大多数情况下,如果你编写自己的自定义值类型,你将要实现IEquatable<T>
并覆盖Equals
- 并且相当可能超载各种运营商。
C#允许==
操作符超载(和Equals
被覆盖的方法-虽然==
和Equals
并不一定意味着同样的事情)。
如果你想表示“同一个实例”,那么object.ReferenceEquals
(对于reference-types)是最好的选择。 值类型默认为内部相等。
我什么时候应该使用==什么时候应该使用Equals?
http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx
这正是它与.NET一起使用的方式。 C#FAQ博客更好地解释了 :
Equals方法只是在System.Object中定义的虚拟方法,并且被选择执行的任何类重写。 ==运算符是一个可以由类重载但通常具有标识行为的运算符。
对于尚未重载==的引用类型,它会比较两个引用是否引用同一个对象 - 这正是Equals在System.Object中的实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.