Domanda

So che questa è una domanda stupida e credo che deve essere stato chiesto prima. Tuttavia non riesco a trovare una risposta alla mia domanda.

Ecco alcuni esempi di codice (che ovviamente non può essere compilato) per delineare il mio problema:

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

Il problema che ho è nella seguente riga:

while(result is nothing)

Questa è la sintassi da VB, che ovviamente non è quello che il compilatore C # accetta. Qualcuno potrebbe dirmi come risolvere il problema?

È stato utile?

Soluzione

La sintassi che stai cercando è:

while (result == null)

È inoltre necessario impostare result = null; per cominciare anche

Altri suggerimenti

  • TL; DR:

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

    • Sostituire myVariable e MyVariableType .


    Ci sono altre soluzioni.


if (myVariable == null) sarà non funziona [1] href="http://msdn.microsoft.com/en-us/library/3ewxz6et.aspx" rel="nofollow noreferrer"> tipi . I tipi di valore sono principalmente structs (es DateTime), incluse [2] tipi semplici come int e enumerations. I tipi di valore non supportano un valore null (intrinsecamente).

L'eccezione e la correzione per questo sono annullabile tipi: essenzialmente questi aggiungere null ai valori possibili di tipo struct. Essi sono strutturalmente lo stesso del Maybe<T> si potrebbe sapere da altre lingue [3] . Tu li crea con ValueType? (ad esempio int?), che è lo zucchero sintattico per Nullable<ValueType>.


In alternativa, invece di utilizzare un tipo nullable, si potrebbe paragonare la variabile al valore di default del suo tipo:

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

(Questo funziona sia per i tipi di riferimento (oggetti) e tipi di valore.)
Si noti che si deve sostituire MyVariableType manualmente - purtroppo puoi non do

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

perché default() accetta solo un nome di tipo diretto. (Suppongo si valuta al momento della compilazione.)

struct , in poche parole

  

Mettere le classi povere, le strutture sono cut-down. Immaginate le classi che non lo fanno   Supporto eredità o finalizzatori, e si ha la versione ridotta:   struct. Le strutture sono definiti nello stesso modo come classi (eccetto   della parola struct) e, a parte le limitazioni appena   descritte, le strutture possono avere gli stessi membri ricchi, tra campi,   metodi, proprietà e operatori.   
[Cit da: http://www.albahari.com/valuevsreftypes.aspx ]

classi sono tipi di riferimento : Una variabile di classe (o più precisamente, la sua area di memoria) contiene solo un puntatore ad un'altra area di memoria, in cui sono memorizzati i dati effettivi istanza di oggetto.

tipo Valore variabili contengono direttamente i dati. Ciò può produrre un beneficio velocità dovuto della cache frazione e salvare la ricerca. Ma può anche essere dannoso per le prestazioni nel caso di più le strutture complesse.


Note:

[1] Non anche buttare un errore. myVariable == null sarà sempre e solo produrrà false, perché il vostro myVariable verrà inizializzato con il non-null valore predefinito (zero ( equivalente ) o una struttura di zeri e nulls). Questo valore predefinito è disponibile con default(Type).

[2] Tecnicamente i tipi semplici (tutti tipi built-in tranne string e object) sono le strutture nota a margine:. Il built-in tipi sono alias per i tipi dal sistema namespace.

[3] Ad es in Haskell . In C # Maybe<T> non è built-in, ma può essere implementato. Esso fornisce Nothing come una versione più esplicita / auto-documentazione del null sia per le classi e le strutture.

[4] Non v'è alcuna [4] . No davvero, si può andare a controllare.

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

se è questo che vuoi dire

Anche se si dispone di una risposta si è soddisfatti, c'è qualcosa dietro questo si può trovare interessante o utile.

C'è una differenza tra C # e VB.NET. In VB.NET è possibile scrivere:

Dim b as Boolean

E in C # è possibile scrivere:

bool b;

Sono leggermente diverse. In VB.NET, b è stato dato il valore falso (in altre parole, è stato già inizializzato). In C #, b non ha alcun valore (che non è inizializzato). C # va a un grande sforzo per assicurarsi che non è possibile esaminare il valore di una variabile che non è mai stato inizializzato.

Quindi non si sta verificando se la variabile è inizializzata. In VB.NET non esiste una cosa come una variabile non inizializzata. In C # è impossibile ottenere il valore di una variabile non inizializzata al fine di confrontarlo con qualsiasi cosa.

Si sta verificando se la variabile è stata inizializzata a null o Nothing.

while(result == null)

L'equivalente di nulla in C # è nullo.

while (result == null)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top