3

これは基本的なタイプの質問です。素人っぽいことをお許しください。

ケース 1:

Employee _emp1 = new Employee();
Employee _emp2 = _emp1;
_emp1.Equals(_emp2) ==> RETURNS a True !!

ケース 2:

Employee _emp1 = new Employee();
Employee _emp2 = new Employee();
_emp1.Equals(_emp2) ==> RETURNS a False !!

Memory-Mapping と割り当ての観点から、上記の比較方法と理由を説明していただけますか?

4

7 に答える 7

9

簡単に言えば、デフォルトのコンパレータはオブジェクトインスタンスを比較します。

  • 最初の例では、_emp1との両方_emp2がの同じインスタンスを指しているため、EmployeetrueをEquals返します。

  • 2番目の例では、2つのEmployeeオブジェクトを作成し、 2つの明確に異なるオブジェクトに_emp1なります。_emp2したがって、Equalsfalseを返します。


コピーコンストラクターは、参照型に対して暗黙的に呼び出されないことに注意してください。あなたがしたこと:

Employee _emp1 = new Employee();
Employee _emp2 = new Employee(_emp1); //or _emp1.Clone() if that is implemented

次にEquals、デフォルトのコンパレータを使用すると、2つの一意のオブジェクトであるため、falseが返されます。

また、この動作は値型では同じではないことに注意してください。


さらに、(必要に応じて)とのデフォルトの動作をオーバーライドするEqualsCompareTo、上記のすべてが無効になります。標準的な手法は次のようになります(少し仮定します)。

public bool Equals(object rhs)
{
    var rhsEmployee = rhs as Employee;
    if(rhsEmployee == null) return false;

    return this.Equals(rhsEmployee);
}

public bool Equals(Employee rhs)
{
     return this.EmployeeId == rhs.EmployeeId;
}

参考文献:

于 2013-01-25T09:57:39.957 に答える
4
Employee _emp1 = new Employee();

new Employee()ヒープとスタックに新しいメモリが割り当てられるたびに。

_emp1は、ヒープ(1212など)を指すメモリ内の値であることを意味します。

これで2番目のステートメントがあります

Employee _emp2 = new Employee();

したがって、新しい値_emp2はヒープ内で1414と言います。

そのため、ここでは_emp1.Equals(_emp2)がfalseを返します。

あなたが言う時

_emp1 = _emp2

両方に同じ値を割り当てています。

于 2013-01-25T10:06:55.933 に答える
2

「このリンゴはジョーのものです。このナシは同じ人のものです。このリンゴの持ち主はこのナシの持ち主と同じ人ですか? はい。」

「このリンゴはスーザンのものです。このナシはスーザンのものです。このリンゴの持ち主はこのナシの持ち主と同じ人ですか? いいえ、たまたま両方ともスーザンと呼ばれているだけです。」

于 2013-01-25T09:57:10.217 に答える
1

書き込むときEmployee _emp1は、Employeeのインスタンスを含む別のメモリへのポインタを格納するために必要なメモリを割り当てています。

new Employee();Employeeのインスタンスで埋める新しいメモリを割り当て、このメモリのアドレス(ポインタ)を返します。たとえば、1234567のようなものです。したがって、実行後Employee _emp1 = new Employee();_emp11234567に等しくなり、1234567が指すメモリには従業員が含まれます。

次に、を実行すると、1234567に等しいEmployee _emp2 = _emp1;Employee()のインスタンスを含むメモリへのアドレスを含むことができる別のメモリが得られます。これは、両方の変数が同じメモリを指しているため、_emp2実行すると結果がtrueになることを意味します。_emp1.Equals(_emp2)

2番目のケースでは、Employeeの別のインスタンスが作成され、別のメモリに配置され(たとえば、7654321など)、このアドレスが割り当てられる_emp2ため、とは異なり_emp1ます。

于 2013-01-25T10:09:24.640 に答える
1

Equals独自のメソッドを作成する必要があります。デフォルトEqualsでは、クラスから呼び出されますObject。これは基本的に、これら 2 つの参照が 1 つのオブジェクトを指しているかどうか (つまりObject.ReferenceEqual(object, object)、呼び出されているかどうか) をチェックします。

于 2013-01-25T09:57:18.617 に答える
1

Employee.Equals()、独自のメソッドを実装していない場合はObject.Equals()、参照を比較するだけの を使用しています。ケース1では、割り当て時に2つの参照が等しくなります。

Employeeオブジェクトを内部プロパティで比較する.Equals()場合は、それらのプロパティ値がすべて一致する場合に true を返し、そうでない場合に false を返す独自のメソッドを実装する必要があります。

于 2013-01-25T10:00:27.107 に答える
1

従業員の 2 つの別個のインスタンスを同一視する方法はありません。これらは別個のインスタンスであるため、それらが等しいかどうかを同一視する方法が必要です。ケース 1 では、インスタンスは同じであり_emp2、インターフェイス_emp1を実装することでこれを行うことができIEquatable<T>ます。

public class Employee : IEquatable<Employee>
{
  public int Id { get; set; }

  public bool Equals(Employee other)
  {
    return other.Id == Id;
  } 
}

その後、これを行うことができます

Employee e = new Employee() { Id = 1 };
Employee e2 = new Employee() { Id = 1 };
//Returns true
bool b = e.Equals(e2);
于 2013-01-25T10:00:39.353 に答える