3 votes

Comportement étrange de .Net sur l'égalité des adresses IP

Possible Duplicate:
comment comparer des adresses IP

S'il vous plaît, quelqu'un peut-il me dire pourquoi ce code (.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());

Montrez-moi les résultats suivants dans la console : Not any 0.0.0.0

13voto

Osiris Points 2833

Utiliser la méthode Equals.

if (ip.Equals(IPAddress.Any))

1voto

Viktor S. Points 12026

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

Selon MSDN (voir la section Surcharge de l'opérateur ==):

Par défaut, l'opérateur == teste l'égalité des références en déterminant si deux références indiquent le même objet, donc les types de référence n'ont pas besoin de mettre en œuvre l'opérateur == pour obtenir cette fonctionnalité.

Il apparaît que la classe IPAddress ne remplace pas l'opérateur == et vous comparez les références de deux instances différentes. Comme mentionné précédemment, vous devriez utiliser la fonction .Equals() pour comparer deux instances de IPAdress.

0voto

Soner Gönül Points 35739

IPAddress.Any est un champ statique en lecture seule. IPAddress est une classe donc lorsque vous essayez de vérifier l'égalité, elles sont vérifiées par leur référence. C'est pourquoi vous avez eu une erreur. Essayez avec la méthode Equals().

Fournit une adresse IP indiquant que le serveur doit écouter l'activité des clients sur toutes les interfaces réseau.

-1voto

Richard K. Points 1025

Pour des raisons connues de Microsoft, le framework évalue IPAddress.Parse("0.0.0.0") en utilisant leurs objectIDs plutôt que leurs valeurs lorsque vous demandez une comparaison au niveau de l'objet. Autrement dit, vous demandez si les deux sont le même objet (c'est-à-dire des pointeurs internes vers les valeurs stockées) plutôt que la même valeur.

Cependant, vous pouvez obtenir ce que vous recherchez en utilisant la méthode Equals():

IPAddress ipMine = IPAddress.Parse("0.0.0.0");
IPAddress ipAny = IPAddress.Any;

Console.WriteLine(ipMine == ipAny);         // produira false
Console.WriteLine(ipMine.Equals(ipAny));    // produira true

La gestion implicite intégrée du framework des objets de base (int, float, string, etc) comme des types primitifs aux bons moments nous gâte parfois, et il vaut toujours la peine de se rappeler que pour les types complexes, .NET les traitera, par défaut, comme des références à moins que l'auteur implémente explicitement des méthodes d'opérateur. Dans le cas ci-dessus, MS a décidé qu'il était plus utile que le comportement par défaut soit la comparaison par réf, mais Equals devrait toujours faire une comparaison basée sur la valeur, donc tout va bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X