0

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?
    }
}
4

1 に答える 1

3

多くの 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 です。Java で sを比較する正しい方法Stringは、実際には を使用することstring1.equals(string2)です。

*:オーバーロードされ、オーバーライドされていません(重要)。Jon Skeet のコメントを参照してください。

于 2012-11-24T07:43:00.627 に答える