读书人

值类型的Equals方法重载疑问,该如何解

发布时间: 2012-02-02 23:57:14 作者: rapoo

值类型的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在其内部调用类型安全的那个版本,这种方式为什么被标注为……

读书人网 >.NET Framework

热点推荐