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

5Yr*_*DBA 13 c#

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

Jon*_*eet 17

那么,==可以重载参考类型.例如:

string a = new string('x', 10);
string b = new string('x', 10);
Console.WriteLine(a == b); // True
Console.WriteLine(Object.ReferenceEquals(a, b)); // False
Run Code Online (Sandbox Code Playgroud)

除非它被重载,否则==表示"引用相等",也就是引用类型的"对象标识".(正如Marc所说,你可以覆盖Equals而不会超载==.)

对于值类型,您必须重载==否则C#编译器将不允许您使用它进行比较..NET本身将提供一个Equals通常做正确的事情的实现,但有时候很慢 - 在大多数情况下,如果你编写自己的自定义值类型,你也想要实现IEquatable<T>和覆盖Equals- 并且很可能使各种运算符超载.


Mar*_*ell 8

C#允许==运营商超载(和Equals被覆盖的方法-虽然==Equals具备意味着同样的事情).

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