| 订阅 | 在线投稿
分享
 
 
 

.Net中的相等性比较

来源:互联网网民  宽屏版  评论
2006-09-15 06:27:56

.Net中的运算符是通过静态函数实现的,如果要为一个类定义某个运算符,需要声明一个具有operator关键字的静态成员函数。这样,运算符就不能利用多态和重载的特性了。对于相等(==)和不相等(!=)运算符也一样,会调用运算符两边变量类型的静态比较方法,而不会调用变量所指向的对象类型的比较方法。

.Net中预定义的类型,都已经内建了相等和不相等运算符。对于预定义的值类型,则比较操作数的值,对于string以外的引用类型,是比较引用,是否指向同一个对象。对于string类型,会比较字符串的值。对于自己定义的引用类型,默认就具有相等和不相等运算符,是比较引用,所以可以不实现这两个运算符,如果要进行其它方式的比较,再去实现。而自己定义的值类型,如果要比较,就必须自己实现这两个运算符。

object类有三个比较方法。非静态的Equals方法只是比较引用,但它是可以重载的,如果想利用多态性,可以重载这个方法。对于预定义的类型,这个方法作用与相等运算符是一致的。静态的Equals方法调用了非静态的Equals方法进行比较,这是源码:

public static bool Equals(object objA, object objB)

{

if (objA == objB)

{

return true;

}

if ((objA != null) && (objB != null))

{

return objA.Equals(objB);

}

return false;

}

静态的ReferenceEquals方法只是调用了object类型相等运算符,而object类型相等运算符是比较引用,这是源码:

public static bool ReferenceEquals(object objA, object objB)

{

return (objA == objB);

}

就是说,object类本身的这三个方法都是比较引用,因为object类是没有数据的。

另外,值得注意一下,.Net中string类实例的建立是做了优化的。例如,在一个方法中定义:

string a = “shit”;

string b = “shit”;

bool equal = object.ReferenceEquals(a, b);

结果equal的值为true。就是说,如果建立的string变量被赋予相同的值,在内存中只构建了一个string对象的实例。因为string是“只读”的,这样做是安全的。

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
.Net中的运算符是通过静态函数实现的,如果要为一个类定义某个运算符,需要声明一个具有operator关键字的静态成员函数。这样,运算符就不能利用多态和重载的特性了。对于相等(==)和不相等(!=)运算符也一样,会调用运算符两边变量类型的静态比较方法,而不会调用变量所指向的对象类型的比较方法。 .Net中预定义的类型,都已经内建了相等和不相等运算符。对于预定义的值类型,则比较操作数的值,对于string以外的引用类型,是比较引用,是否指向同一个对象。对于string类型,会比较字符串的值。对于自己定义的引用类型,默认就具有相等和不相等运算符,是比较引用,所以可以不实现这两个运算符,如果要进行其它方式的比较,再去实现。而自己定义的值类型,如果要比较,就必须自己实现这两个运算符。 object类有三个比较方法。非静态的Equals方法只是比较引用,但它是可以重载的,如果想利用多态性,可以重载这个方法。对于预定义的类型,这个方法作用与相等运算符是一致的。静态的Equals方法调用了非静态的Equals方法进行比较,这是源码: public static [url=http://www.aisto.com/roeder/dotnet/Default.aspx?Object=1]bool[/url] Equals([url=http://www.aisto.com/roeder/dotnet/Default.aspx?Object=2]object[/url] objA, [url=http://www.aisto.com/roeder/dotnet/Default.aspx?Object=3]object[/url] objB) { if (objA == objB) { return true; } if ((objA != null) && (objB != null)) { return objA.[url=http://www.aisto.com/roeder/dotnet/Default.aspx?Object=4]Equals[/url](objB); } return false; } 静态的[url=ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref2/html/M_System_Object_ReferenceEquals_1_154de988.htm]ReferenceEquals[/url]方法只是调用了object类型相等运算符,而object类型相等运算符是比较引用,这是源码: public static [url=http://www.aisto.com/roeder/dotnet/Default.aspx?Object=6]bool[/url] ReferenceEquals([url=http://www.aisto.com/roeder/dotnet/Default.aspx?Object=7]object[/url] objA, [url=http://www.aisto.com/roeder/dotnet/Default.aspx?Object=8]object[/url] objB) { return (objA == objB); } 就是说,object类本身的这三个方法都是比较引用,因为object类是没有数据的。 另外,值得注意一下,.Net中string类实例的建立是做了优化的。例如,在一个方法中定义: string a = “shit”; string b = “shit”; bool equal = object.[url=ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref2/html/M_System_Object_ReferenceEquals_1_154de988.htm]ReferenceEquals[/url](a, b); 结果equal的值为true。就是说,如果建立的string变量被赋予相同的值,在内存中只构建了一个string对象的实例。因为string是“只读”的,这样做是安全的。
󰈣󰈤
 
 
 
>>返回首页<<
 
 热帖排行
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
©2005- 王朝网络 版权所有