【问题标题】:How is object equivalence determined by the CLR?CLR 如何确定对象等效性?
【发布时间】:2012-11-24 07:40:13
【问题描述】:

在 C# 等面向对象的语言中,CLR 如何区分具有相同值的相同类型的对象?

例如:

class Foo 
{
    public string name {get; set;}

    public foo(string name)
    { 
        this.Name = name;
    }
}

class Bar
{
    public void Main()
    {
        Foo foo1 = new Foo("Jim"); //This foo is named "Jim."
        Foo foo2 = new Foo("Jim"); //So is this one.

        bool areEqual = (foo1 == foo2); //How is the CLR determining equivalence?
    }
}

【问题讨论】:

    标签: c# oop object clr


    【解决方案1】:

    在许多 OO 语言中(包括 C#,尽管行为可能被重载*),== 运算符检查对每个对象的引用是否相等,而不是对象的内容。

    因此,例如,发生了这种事情:

    Foo foo1 = new Foo("Jim");
    // The Foo pointed to by foo1 is stored at memory location 0x47008
    Foo foo2 = new Foo("Jim");
    // The Foo pointed to by foo2 is stored at memory location 0x57008
    
    bool areEqual = (foo1 == foo2);
    // areEqual is false, as the comparison being made is 0x47008 == 0x57008
    

    除非显式重载,否则这是 C# 中所有对象的行为。一个值得注意的例外是 string 类型,它重载了* == 以实际比较字符串的内容。一个反例是 Java,它 not 允许运算符重载;在Java中比较Strings的正确方法实际上是使用string1.equals(string2)

    *:重载,而不是覆盖(重要)。请参阅 Jon Skeet 的评论。

    【讨论】:

    • 嗯,这很简单:)。
    • 只是看着它,我想这是普遍的行为。如果您愿意,您将如何重载 == 运算符?我的意思是,您可以轻松地使用 IComparable 之类的东西,但我只是好奇。
    • 这很简单:只需声明这样的方法public static operator == (Foo a, Foo b) { .. logic here... }
    • 轻微修正:== 的行为不能被覆盖 - 它可以被重载。这意味着它不是多态的——如果你比较两个相同但不同的字符串对象的引用,并且编译时类型是object,它仍然会返回false
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多