1.“==”和Equals两个真的有关联吗?
  对于“==”和Equals大多数网友都是这样总结的:
  “==” 是比较两个变量的值相等。
  Equals是比较两个变量是否指向同一个对象。
  public class Person
  {
  public Person(string name)
  {
  this.Name = name;
  }
  public string Name { get; set; }
  }
  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);         //true
  Console.WriteLine(a.Equals(b));    //true
  object g = a;
  object h = b;
  Console.WriteLine(g == h);         //false
  Console.WriteLine(g.Equals(h));    //true
  Person p1 = new Person("jia");
  Person p2 = new Person("jia");
  Console.WriteLine(p1 == p2);       //false
  Console.WriteLine(p1.Equals(p2));  //false
  Person p3 = new Person("jia");
  Person p4 = p3;
  Console.WriteLine(p3 == p4);       //true
  Console.WriteLine(p3.Equals(p4));  //true
  Console.ReadKey();
  }
  假如上述结论正确,“==” 是比较两个变量值相等,那么下面这句代码不应该为True.
  Console.WriteLine(a == b);         //true


  很明显,上面的两个字符串变量:a,b 是指向两个不同的对象,即它们在栈空间存储的内存地址也是不同的。但为毛它们相等了呢?
  2.什么是运算符重载?
  运算符重载,是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。打个简单的比方:“+” 运算符,在“+” 两边全为数值类型的变量时,“+” 运算符表示数学上的“+” 意义。若“+” 运算符两边只要有一个为字符串类型,那么“+” 运算符表示连接字符串的意义。这样的运算符重载实例有很多,那么这跟本文主题有毛关系?我想说的是,上面字符串变量:a , b 是因为String类重载了运算符 “==”,看下列源代码:
  public static bool operator == (String a, String b)
  {
  return String.Equals(a, b);
  }
  public static bool operator != (String a, String b)
  {
  return !String.Equals(a, b);
  }
  很明显String类中真的重载了“==”运算符,并且不止 “==” 还有 “!=” 哦。并且在重载运算符方法内部直接调用String类中的Equals方法,源代码如下:
  public static bool Equals(String a, String b)
  {
  if ((Object)a==(Object)b)
  {
  return true;
  }
  if ((Object)a==null || (Object)b==null)
  {
  return false;
  }
  if (a.Length != b.Length)
  return false;
  return EqualsHelper(a, b);
  }
  由上可得:“==” 运算符并不一定是比较两个变量中存储的值是否相等,这要看当前运算符在当前这个类型中是否写有重载。