可能重复:
如何比较 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
可能重复:
如何比较 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
使用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 最了解的原因,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应该始终进行基于值的比较,所以你们都很好。