IPAddress上的奇怪.Net行为等于

时间:2012-12-24 12:55:35

标签: c# .net

  

可能重复:
  how to compare ip addresses

请告诉我某人,为什么这段代码(.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

4 个答案:

答案 0 :(得分:11)

使用Equals方法。

if (ip.Equals(IPAddress.Any))

答案 1 :(得分:1)

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

根据MSDN(参见覆盖运营商== 部分):

  

默认情况下,运算符==测试引用相等性   确定两个引用是否表示相同的对象,因此引用   类型不需要实现operator ==以获得此功能   功能。

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

答案 2 :(得分:0)

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

  

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

答案 3 :(得分:0)

出于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应该总是进行基于值的比较,所以你们都很好。