Como saber se uma variável foi inicializada em C#?
Pergunta
Eu sei que esta é uma pergunta idiota e acho que deve ter sido feita antes.No entanto, não consigo encontrar uma resposta para minha pergunta.
Aqui está um exemplo de código (que obviamente não é compilado) para descrever meu 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);}
}
}
}
O problema que tenho está na seguinte linha:
while(result is nothing)
Esta é a sintaxe do VB, que obviamente não é a que o compilador C# aceita.Alguém poderia me dizer como resolver o problema?
Solução
A sintaxe que você está procurando é:
while (result == null)
Você também tem que definir result = null;
para começar com também
Outras dicas
DR:
if (Object.Equals(
myVariable
, default(
MyVariableType
)))
- Substituir
myVariable
eMyVariableType
.
Existem outras soluções.- Substituir
if (myVariable == null)
vai não funciona[1] com valor tipos.Os tipos de valor são principalmente struct
s (por ex. DateTime
), Incluindo[2] o tipos simples como int
, e enum
erações.Os tipos de valor não suportam um null
valor (intrinsecamente).
A exceção e a solução para isso são anulável tipos:Essencialmente, estes adicionam null
aos valores possíveis de um tipo struct.Eles são estruturalmente iguais aos Maybe<T>
você pode saber de outros idiomas[3].Você os cria com ValueType?
(por exemplo. int?
) que é açúcar sintático para Nullable<ValueType>
.
Como alternativa, em vez de usar um tipo anulável, você pode comparar sua variável com o valor padrão do tipo:
if (Object.Equals(myVariable, default(MyVariableType)))
(Isso funcionará tanto para tipos de referência (objetos) quanto para tipos de valor.)
Observe que você deve substituir MyVariableType
manualmente – infelizmente você pode não fazer
if (Object.Equals(myVariable, default(myVariable.GetType())))
porque default()
aceita apenas um nome de tipo diretamente.(Suponho que seja avaliado em tempo de compilação.)
estruturas em poucas palavras
Simplificando, structs são classes reduzidas.Imagine classes que não suportam herança ou finalizadores, e você tem a versão reduzida:a estrutura.Estruturas são definidas da mesma maneira que as classes (exceto com o
struct
palavra -chave) e, além das limitações descritas, as estruturas podem ter os mesmos membros ricos, incluindo campos, métodos, propriedades e operadores.
[Citado de: http://www.albahari.com/valuevsreftypes.aspx ]
As aulas são tipos de referência:Uma variável de classe (ou mais especificamente, sua área de memória) contém apenas um ponteiro para outra área de memória, onde os dados reais da instância do objeto são armazenados.
Tipo de valor variáveis contêm diretamente os dados.Isto pode render um benefício de velocidade devido a localidade de cache e salvando a pesquisa.Mas também pode ser prejudicial ao desempenho no caso de estruturas mais complexas.
Notas de rodapé:
[1] Nem gera um erro. myVariable == null
sempre apenas renderá false
, porque seu myVariable
será inicializado com o não-null
padrão valor (zero (equivalente) ou uma estrutura de zeros e null
e).Este valor padrão está disponível com default(Type)
.
[2] Tecnicamente, os tipos simples (todos tipos integrados exceto string
e object
) são estruturas.Nota:Os tipos integrados são apelido para tipos do Sistema espaço para nome.
[3] Por ex. em Haskell.Em C# Maybe<T>
não está integrado, mas pode ser implementado.Ele fornece Nothing
como uma versão mais explícita/autodocumentada de null
tanto para classes quanto para estruturas.
[4] Não há [4].Não, sério, você pode ir e verificar.
while (result == null)
while (result ==null )
Se é isso que você quer dizer
Embora você tenha uma resposta com a qual você está feliz, há algo por trás disso que você pode achar interessante ou útil.
Há uma diferença entre C# e VB.net. Em vb.net, você pode escrever:
Dim b as Boolean
E em C# você pode escrever:
bool b;
Eles são sutilmente diferentes. Em vb.net, b
recebeu o valor falso (em outras palavras, ele já foi inicializado). Em C#, b
não tem valor (não é inicializado). C# vai a muito esforço para garantir que você não possa examinar o valor de uma variável que nunca foi inicializada.
Portanto, você não está testando se a variável é inicializada. No vb.net, não existe uma variável não inicializada. Em C#, é impossível obter o valor de uma variável não inicializada para compará -la com qualquer coisa.
Você está testando se a variável foi inicializada para null
ou Nothing
.
while(result == null)
O equivalente a nada em C# é nulo.
while (result == null)