Question

Je sais que c'est une question stupide et je suppose que cela a dû être posé auparavant. Cependant, je ne peux pas trouver de réponse à ma question.

Voici un exemple de code (qui ne compile bien sûr pas) pour décrire mon problème:

class test
{
     int[] val1;
     string val2;

     static bool somefunction(test x, test y)
     {
         dosomestuff()

         test result;

         while(result is nothing)
         {
              if(somecondition){result=new test(something);}
         }
     }
}

Le problème que j'ai est dans la ligne suivante:

while(result is nothing)

C'est la syntaxe de VB, ce qui n'est bien sûr pas ce que le compilateur C # accepte. Quelqu'un pourrait-il me dire comment résoudre le problème?

Était-ce utile?

La solution

La syntaxe que vous recherchez est:

while (result == null)

Vous devez également définir result = null; Pour commencer aussi

Autres conseils

  • Tl; dr:

    if (Object.Equals(myVariable, default(MyVariableType)))

    • Remplacer myVariable et MyVariableType.


    Il existe d'autres solutions.


if (myVariable == null) sera ne pas travailler[1] avec évaluer les types. Les types de valeur sont principalement structS (par exemple DateTime), y compris[2] la types simples Comme int, et enumérations. Les types de valeur ne prennent pas en charge un null valeur (intrinsèquement).

L'exception et le correctif à cela sont nullable Types: essentiellement ceux-ci ajoutent null aux valeurs possibles d'un type de structure. Ils sont structurellement les mêmes que le Maybe<T> Vous savez peut-être dans d'autres langues[3]. Vous les créez avec ValueType? (par exemple int?) qui est du sucre syntaxique pour Nullable<ValueType>.


Alternativement, au lieu d'utiliser un type nullable, vous pouvez comparer votre variable à la valeur par défaut de son type:

if (Object.Equals(myVariable, default(MyVariableType)))

(Cela fonctionnera à la fois pour les types de référence (objets) et les types de valeur.)
Notez que vous devez remplacer MyVariableType manuellement - malheureusement vous pouvez ne pas fais

if (Object.Equals(myVariable, default(myVariable.GetType())))

car default() Accepte uniquement un nom de type directement. (Je suppose qu'il évalue au temps de compilation.)


structures en un mot

En termes simples, les structures sont des classes coupées. Imaginez des cours qui ne prennent pas en charge l'héritage ou les finalisateurs, et vous avez la version coupée: la structure. Les structures sont définies de la même manière que les classes (sauf avec le struct Mot-clé), et en dehors des limitations qui viennent d'être décrites, les structures peuvent avoir les mêmes membres riches, y compris les champs, les méthodes, les propriétés et les opérateurs.
Cité de: http://www.albahari.com/valuevsreftypes.aspx ]

Les classes sont types de référence: Une variable de classe (ou plus spécifiquement, sa zone de mémoire) ne contient qu'un pointeur vers une autre zone de mémoire, où les données d'instance d'objet réelles sont stockées.

Type de valeur Les variables contiennent directement les données. Cela peut produire un avantage de vitesse dû à localité de cache et sauver la recherche. Mais cela peut également être préjudiciable aux performances dans le cas de structures plus complexes.



Notes de bas de page:

1] Il ne lance même pas d'erreur. myVariable == null va toujours céder false, parce que votre myVariable sera initialisé avec le nonnull défaut valeur (zéro (équivalent) ou une structure de zéros et nulls). Cette valeur par défaut est disponible avec default(Type).

2] techniquement les types simples (tous types intégrés à l'exception string et object) sommes Structs. Remarque latérale: les types intégrés sont alias pour les types du Système Espace de noms.

3] EG dans Haskell. En C # Maybe<T> n'est pas intégré, mais peut être implémenté. Il offre Nothing En tant que version plus explicite / auto-documentaire de null à la fois pour les classes et les structures.

4] Il n'y a pas [4]. Non vraiment, vous pouvez aller vérifier.

while (result == null)
while (result ==null )

Si c'est ce que tu veux dire

Bien que vous ayez une réponse dont vous êtes satisfait, il y a quelque chose derrière vous, vous pouvez trouver intéressant ou utile.

Il existe une différence entre C # et VB.NET. Dans vb.net, vous pouvez écrire:

Dim b as Boolean

Et en C #, vous pouvez écrire:

bool b;

Ils sont subtilement différents. Dans vb.net, b a reçu la valeur fausse (en d'autres termes, elle a déjà été initialisée). En C #, b n'a aucune valeur (il n'est pas initialisé). C # va à beaucoup d'efforts pour vous assurer que vous ne pouvez pas examiner la valeur d'une variable qui n'a jamais été initialisée.

Vous ne testez donc pas si la variable est initialisée. Dans VB.NET, il n'y a pas de variable non initialisée. En C #, il est impossible d'obtenir la valeur d'une variable non initialisée afin de le comparer avec n'importe quoi.

Vous testez si la variable a été initialisée pour null ou Nothing.

while(result == null)

L'équivalent de rien en C # est nul.

while (result == null)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top