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?

Foi útil?

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 e MyVariableType.


    Existem outras soluções.


if (myVariable == null) vai não funciona[1] com valor tipos.Os tipos de valor são principalmente structs (por ex. DateTime), Incluindo[2] o tipos simples como int, e enumeraçõ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 nulle).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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top