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

时间:2010-03-01 21:26:18

标签: c#

在Java中,引用类型有“==”和“equals”运算符,值类型有“==”。对于引用类型,“==”表示两个对象都指向同一位置,“等于”表示它们的值相同。 C#是否有值类型和引用类型的类似运算符?

5 个答案:

答案 0 :(得分:15)

嗯,==可以为参考类型重载。例如:

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>并覆盖{ {1}} - 并且很可能使各种运算符过载。

答案 1 :(得分:8)

C#允许重载==运算符(并覆盖Equals方法 - 尽管==Equals >意思是同样的事情。)

如果您想表示“同一个实例”,那么object.ReferenceEquals(对于参考类型)是最佳选择。值类型默认为内部相等。

答案 2 :(得分:2)

直接离开MSDN

  

对于预定义的值类型,   如果,则等于运算符(==)返回true   其操作数的值相等,   否则是假的。适用于参考类型   除了string之外,==如果返回true则返回true   它的两个操作数指的是相同的   宾语。对于字符串类型,==   比较字符串的值。

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

答案 3 :(得分:1)

我什么时候应该使用==?什么时候应该使用Equals?

http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx

答案 4 :(得分:0)

这正是它与.NET一起使用的方式。 C# FAQ blog explains equals better

  

Equals方法只是一个虚拟方法   一个在System.Object中定义的,和   被任何一个班级选择覆盖   这样做。 ==运算符是一个   可以超载的运算符   课程,但通常有   身份行为。

     

对于==没有的参考类型   超载,它比较是否   两个参考文献指的是相同的   对象 - 这正是什么   Equals的实施确实在   System.Object的。