值类型的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方法对于值类型是比较两个值对象内的值是否相等。
------解决方案--------------------