C#中==Equalsメソッドとの違い

3772 ワード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Person(string name)
{
this.name = name;
}
}
class program
{
static void Main(string[] args)
{
string a = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o"" });
string b = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o"" });
Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b));
object g = a;
object h = b;
Console.WriteLine(g == h);
Console.WriteLine(g.Equals(h));
Person p1 = new Person("jia");
Person p2 = new Person("jia");
Console.WriteLine(p1 == p2);
Console.WriteLine(p1.Equals(p2));
Person p3 = new Person("jia");
Person p4 = p3;
Console.WriteLine(p3 == p4);
Console.WriteLine(p3.Equals(p4));
Console.ReadLine();
}
}
}

 
出力結果:true,true,false,true,false,false,true,true.以下にまとめる.
 
1、値タイプに対して、==とequalsは等価であり、いずれも情報を記憶する内容である.2、参照タイプについて、==闘力は参照タイプのスタック内のアドレスであり、equalsメソッドの例は、管理スタック内の参照タイプの記憶情報の内容である.3、stringクラスに対して特別に罰を処理しなければならない.それは内部でequalsメソッドと==を処理したクラスであるため、==とequalsは等価で、情報を保存する内容である.4、いくつかのカスタムクラスについては、equalsメソッドを再ロードする必要があります.そうしないと、ベースクラスのequalsメソッドとしてデフォルト化されます(ベースクラスには、管理スタックに格納されている情報のタイプを参照するのではなく、ObjectクラスのEqualsメソッドが再ロードされていません).
 
 
 
だから私たちは以下の出力を理解するのは難しくありません.
 
Person p1 = new Person("jia");
Person p2 = new Person("jia");
Console.WriteLine(p1 == p2);// False
Console.WriteLine(p1.Equals(p2));// False

 
5、stringについて定数文字列と文字列変数の違いを誇張する必要があります.例を見てください.
 
//  
string x = "should it matter"; // ,
string y = "should it matter";
object c = x;
object d = y;
Console.WriteLine(c == d);// True
Console.WriteLine(c.Equals(d));// True
//
string a = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o"" });// ,
string b = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o"" });
object g = a;
object h = b;
Console.WriteLine(g == h);// False
Console.WriteLine(g.Equals(h));// True

 
彼らが割り当てたアドレスの体式フォーマットは異なり、string x=「should it matter」である.その初期値は定数であるため、そのアドレスは管理スタック上の静的記憶領域、すなわちいわゆる定数プールに割り当てられ、ビル主のstring a=new string(new char[]{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""})である.これは、管理スタック上で動的に割り当てられたアドレスではありません.  http://www.byywee.com/page/M0/S706/706092.html