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());

コンソールに次の結果を表示: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によると(演算子のオーバーライド==セクションを参照):

デフォルトでは、演算子==は、2つの参照が同じオブジェクトを示しているかどうかを判断することによって参照の同等性をテストするため、この機能を取得するために参照型で演算子==を実装する必要はありません。

表示されているように、IPAddressは==演算子をオーバーライドせず、2つの異なるインスタンスの参照を比較します。すでに述べたように、関数を使用して2つのインスタンス.Equals()を比較する必要があります。IPAdress

于 2012-12-24T13:07:17.840 に答える
0

IPAddress.Any静的な読み取り専用フィールドです。IPAddressはクラスであるため、同等性をチェックしようとすると、参照によってチェックされます。そのため、エラーが発生しました。wityEquals()メソッドを試してください。

サーバーがすべてのネットワークインターフェイスでクライアントアクティビティをリッスンする必要があることを示すIPアドレスを提供します。

于 2012-12-24T13:03:04.463 に答える
-1

Microsoftに最もよく知られている理由により、フレームワークはIPAddress.Parse("0.0.0.0")、オブジェクトレベルの比較を要求するときに、値ではなくobjectIDを使用して評価します。つまり、2つが同じ値ではなく、同じオブジェクト(つまり、格納された値への内部ポインタ)であるかどうかを尋ねています。

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 に答える