C#==值类型和引用类型不同吗?

C#==值类型和引用类型不同吗?,c#,C#,在Java中,引用类型有“==”和“equals”运算符,值类型有“==”。对于引用类型,“==”表示两个对象指向同一位置,“等于”表示它们的值相同。C#对于值类型和引用类型是否具有类似的运算符?那么,对于引用类型,==可以重载。例如: string a = new string('x', 10); string b = new string('x', 10); Console.WriteLine(a == b); // True Console.WriteLine(Object.Referen

在Java中,引用类型有“==”和“equals”运算符,值类型有“==”。对于引用类型,“==”表示两个对象指向同一位置,“等于”表示它们的值相同。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
并重写
Equals
——并且很可能重载各种运算符。

C#允许重载
=
运算符(要重写的
Equals
方法-尽管
==
Equals
的含义不一定相同)

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

直接来自:

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


但是,应该能够给您一个完美的答案:p

这正是它与.NET一起工作的方式

Equals方法只是一个虚拟方法 在System.Object中定义的一个,以及 由选择的类重写 ==运算符是一个 运算符,可以通过 类,但通常有 身份行为

对于引用类型,其中==尚未 如果过载,则比较是否 两个参考文献指的是相同的 对象-这正是 《平等法》的实施 System.Object


何时应该使用==以及何时应该使用Equals


是的,他以46秒的优势击败了我!我在写回复时就知道乔恩会给出一个非常好的答案。