奇怪的.Net在IPAddress上的行为等于

本文关键字:IPAddress Net | 更新日期: 2023-09-27 17:49:30

可能重复:
如何比较ip地址

请告诉我为什么这个代码(.Net 4.0(:

IPAddress ip = IPAddress.Parse("0.0.0.0");
if (ip == IPAddress.Any) Console.WriteLine("any"); 
else Console.WriteLine("Not any");
Console.WriteLine(IPAddress.Any.ToString());

在控制台中显示下一个结果:没有0.0.0.0

奇怪的.Net在IPAddress上的行为等于

使用Equals方法。

if (ip.Equals(IPAddress.Any))

http://msdn.microsoft.com/ru-ru/library/ms173147(v=vs.80(.aspx

根据MSDN(请参阅覆盖运算符=部分(:

默认情况下,运算符==通过确定两个引用是否指示同一对象,因此引用类型不需要实现运算符==即可获得功能。

如图所示,IPAddress不会覆盖==运算符,并且可以比较两个不同实例的引用。如前所述,您应该使用.Equals()函数来比较两个IPAdress实例。

IPAddress.Any是一个静态只读字段。IPAddress是一个类,因此当您尝试检查相等性时,它们会通过引用进行检查。这就是你出错的原因。尝试使用Equals()方法。

提供一个IP地址,指示服务器必须侦听所有网络接口上的客户端活动。

由于Microsoft最清楚的原因,当您要求进行对象级比较时,框架使用它们的objectID而不是它们的值来评估IPAddress.Parse("0.0.0.0")。也就是说,您正在询问这两者是否是相同的对象(即指向存储值的内部指针(,而不是相同的

然而,您可以使用Equals()方法来完成您想要的操作:

IPAddress ipMine = IPAddress.Parse("0.0.0.0");
IPAddress ipAny = IPAddress.Any;
Console.WriteLine(ipMine == ipAny);         // will output false
Console.WriteLine(ipMine.Equals(ipAny));    // will output true

框架在正确的时间将基本对象(int、float、string等(作为基元进行内置的隐式处理有时会破坏我们的工作,而且值得记住的是,对于复杂类型,.NET默认情况下会将它们作为引用进行处理,除非作者显式实现运算符方法。在上面的情况下,MS认为默认行为是通过ref进行比较更有用,但Equals应该始终进行基于值的比较,所以您都很好。