日期:2014-05-20  浏览次数:20724 次

值类型的Equals方法重载疑问
/// <summary>
  /// 名 称:<br>
  /// </summary>
  /// <remarks>
  /// 版 本:1.0<br>
  /// 作 者:<br>
  /// 创始时间:2011-11-1 10:04:00<br>
  /// 描 述:
  /// ----------修改记录------------<br>
  /// </remarks>
  struct MyValType
  {
  RefType refobj;
  ValType valobj;


  public override Boolean Equals(Object obj)
  {
  if (!(obj is MyValType)) return false;
  //调用类型安全的那个重载版本
  return this.Equals((MyValType)obj);
  }

  /// <summary>
  /// 实现一个强类型版本的Equals
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public Boolean Equals(MyValType obj)
  {
  //比较引用类型字段
  if (!Object.Equals(this.refobj, obj.refobj)) return false;
  //比较引用类型字段
  if (!this.valobj.Equals(obj.valobj)) return false;
  return true;
  }

  public static Boolean operator ==(MyValType v1, MyValType v2)
  {
  return (v1.Equals(v2));
  }

  public static Boolean operator !=(MyValType v1, MyValType v2)
  {
  return !(v1==(v2));
  }

  public class RefType
  {
  public int Var;
  }
  public struct ValType
  {
  public int Var;
  }
  }

一、对于值类型,应该定义一个强类型版本的Equals方法,让其接受定义类型作为参数。这样做不仅可以提供类型安全,而且还可以避免额外的装箱操作。[为值类型实现Equals方法]
二、对于值类型,应该为其定义一个类型安全的Equals来比较对象的状态。然后在实现“非类型安全”的Equals时,在其内部调用类型安全的那个版本。还应该重载==和!=操作符,让他们调用类型安全的Equals方法(但由于可能的隐式转换带来的问题,所以这种做法是不被推荐的)[Equals方法与==/!=操作符的实现]

这是我在看。net框架程序设计时看到的一个疑问 但所有的值类型都是密封(seal)的,所以无法派生出新的值类型, 望高手指点(二)



------解决方案--------------------
对象比较
等价与恒等
这里要注明一点Equals方法对于引用类型是比较两个变量是否引用了同一个对象,它是不管对象的值是否一致的,
但是,Equals方法对于值类型是比较两个值对象内的值是否相等。
------解决方案--------------------
探讨

引用:

对象比较
等价与恒等
这里要注明一点Equals方法对于引用类型是比较两个变量是否引用了同一个对象,它是不管对象的值是否一致的,
但是,Equals方法对于值类型是比较两个值对象内的值是否相等。

我的疑问是为什么在值类型重载Equals方法的时候,“非类型安全”的Equals在其内部调用类型安全的那个版本,这种方式为什么被标注为……