Come a dire se una variabile è stata inizializzata in C #?
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?
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
eMyVariableType
.
Ci sono altre soluzioni. - Sostituire
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 struct
s (es DateTime
), incluse [2] tipi semplici come int
e enum
erations. 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 null
s). 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)