3

可能重复:
如何比较 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());

在控制台中显示下一个结果:Not any 0.0.0.0

4

4 回答 4

13

使用Equals方法。

if (ip.Equals(IPAddress.Any))

于 2012-12-24T12:58:25.633 回答
1

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

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

默认情况下,操作符 == 通过确定两个引用是否指示同一个对象来测试引用是否相等,因此引用类型不需要实现操作符 == 来获得此功能。

看起来,IPAddress 不会覆盖 == 运算符,您可以比较两个不同实例的引用。正如已经提到的,您应该使用.Equals()函数来比较两个IPAdress实例。

于 2012-12-24T13:07:17.840 回答
0

IPAddress.Any是一个静态只读字段。IPAddress是一个类,因此当您尝试检查相等性时,他们会通过引用进行检查。这就是为什么你有一个错误。试试智慧Equals()的方法。

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

于 2012-12-24T13:03:04.463 回答
-1

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

但是,您可以使用以下方法执行您想要的操作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应该始终进行基于值的比较,所以你们都很好。

于 2012-12-24T13:19:12.573 回答