知识大全 C#区别和认识四个判等函数
Posted 函数
篇首语:别裁伪体亲风雅,转益多师是汝师。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#区别和认识四个判等函数相关的知识,希望对你有一定的参考价值。
C#区别和认识四个判等函数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Net有四个判等函数?不少人看到这个标题 会对此感到怀疑 事实上确是如此 Net提供了ReferenceEquals 静态Equals 具体类型的Equals以及==操作符这四个判等函数 但是这四个函数之间有细微的关系 改变其中一个函数的实现会影响到其他函数的操作结果
首先要说的是Object ReferenceEquals和Object Equals这两个静态函数 对于它们俩来说 是不需要进行重写的 因为它们已经完成它们所要得做的操作 对于Object ReferenceEquals这个静态函数 函数形势如下
public static bool ReferenceEquals( object left object right )
这个函数就是判断两个引用类型对象是否指向同一个地址 有此说明后 就确定了它的使用范围 即只能对于引用类型操作 那么对于任何值类型数据操作 即使是与自身的判别 都会返回false 这主要因为在调用此函数的时候 值类型数据要进行装箱操作 也就是对于如下的形式来说
int n =
Object ReferenceEquals( n n )
这是因为对于n这个数据装箱两次 而每次装箱后的地址有不同 而造成Object ReferenceEquals( n n )的结果永远为false
对于第一个判等函数来说 没有什么好扩展的 因为本身已经很好地完成了它所要做的
对于第二个Object Equals这个静态函数 其形式如下
public static bool Equals( object left object right )
按照书中对它的分析 其大致函数代码如下
public static void Equals( object left object right )
// Check object identity
if( left == right )
return true
// both null references handled above
if( ( left == null ) || ( right == null ) )
return false
return left Equals( right )
可以说 Object Equals这个函数完成判等操作 需要经过三个步骤 第一步是需要根据对象所属类型的==操作符的执行结果 第二步是判别是否为null 也是和第一步一样 需要根据类型的==操作符的执行结果 最后一步要使用到类型的Equals函数的执行结果 也就是说这个静态函数的返回结果 要取决于后面要提到的两个判等函数 类型是否提供相应的判等函数 成为这个函数返回结果的重要因素
那么对于Object Equals这个静态方法来说 虽说接受参数的类型也属于引用类型 但是不同于Object ReferenceEquals函数 对于如下的代码 能得出正确的结果
int n =
Debug WriteLine( string Format( Object Equals( n n ) ) )
Debug WriteLine( string Format( Object Equals( n ) ) )
这是因为在此函数中要用到具体类型的两个判等函数 不过就函数本身而言 该做的判断都做了 因此不需要去重载添加复杂的操作
为了更好的述说剩下两个函数 先解释一下等价的意义 对于等价的意义 就是自反 对称以及传递
所谓自反 即a == a
而对称 是a == b 则b == a
传递是 a == b b == c 则 a == c
理解等价的意义后 那么在实现类型的判等函数也要满足这个等价规则
对于可以重载的两个判等函数 首先来介绍的是类型的Equals函数 其大致形式如下 public override bool Equals( object right )
那么对于一个类型的Equals要做些什么操作呢 一般来说大致如下
public class KeyData
private int nData
public int Data
get return nData
set nData = value
public override bool Equals( object right )
//Check null
if( right == null )
return false
//check reference equality
if( object ReferenceEquals( this right ) )
return true
//check type
if( this GetType() != right GetType() )
return false
//convert to current type
KeyData rightASKeyData = right as KeyData
//check members value
return this Data == rightASKeyData Data
如上增加了一个类型检查 即
if( this GetType() != right GetType() )这部分 这是由于子类对象可以通过as转化成基类对象 从而造成不同类型对象可以进行判等操作 违反了等价关系
除此外对于类型的Equals函数来 其实并没有限制类型非要属于引用类型 对于值类型也是可以重载此函数 但是我并不推荐 主要是Equals函数的参数类型是不可变的 也就是说通过此方法 值类型要经过装箱操作 而这是比较影响效率的
而对于值类型来说 我推荐使用最后一种判等函数 即重载运算符==函数 其大致形式如下
public static bool operator == ( KeyData left KeyData right )
对于一个值类型而言 其的大致形式应该如下
public struct KeyData
private int nData
public int Data
get return nData
set nData = value
public static bool operator == ( KeyData left KeyData right )
return left Data == right Data
public static bool operator != ( KeyData left KeyData right )
return left Data != right Data
由于==操作与!=操作要同步定义 所以在定义==重载函数的时候 也要定义!=重载函数 这也是 Net在判等操作保持一致性 那么对于最后一个判等函数 这种重载运算符的方法并不适合引用类型 这就是 Net经常现象 去判断两个引用类型 不要用== 而要用某个对象的Equals函数 所以在编写自己类型的时候 要保留这种风格
那么对于以上介绍的四种判等函数 会产生如下类似的对比表格 操作结果取决于 适用范围 建议Object ReferenceEquals 两个参数对象是否属于同一个引用 引用类型 不要用它来判断值类型数据Object Equals 参数类型自身的判等函数 无限制 考虑装箱操作对值类型数据产生的影响类型的Equals 类型重载函数 无限制 考虑装箱操作对值类型数据产生的影响类型的==重载 类型重载函数 无限制 不要在引用类型中重载此运算符 那么在编写类型判等函数的时候 要注意些什么呢 给出如下几点建议
首先 要判断当前定义的类型是否具有判等的意义
其次 定义类型的判等函数要满足等价规则
cha138/Article/program/net/201311/13522相关参考
C#中构造函数和析构函数的用法(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 声明了一个类
C#中构造函数和析构函数的用法(三) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Bb=new
C#常见和常用函数表 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! DateTime数字型 S
DateTime数字型 SystemDateTimecurrentTime=newSystemDateTime(); 取当前年月日时分秒 currentTime=SystemDateTi
C#默认构造函数的作用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 构造函数主要用来初始化对象
C#一些常用函数的整理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一C#客户端通过POST或
C#调用WindowsAPI函数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Api函数是构筑
c#中Split函数的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!今天用到了这个函数稍微总结
C#中文字符截取函数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ///str_value字符
C#中的eval()函数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 可以这样说绝大多数的大型