繁体   English   中英

C#==在值类型和引用类型上有所不同?

[英]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)是最好的选择。 值类型默认为内部相等。

直接退出MSDN

对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回true,否则返回false。 对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true。 对于字符串类型,==比较字符串的值。

Jon Skeet应该能够给你一个完美的答案:P

我什么时候应该使用==什么时候应该使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM