Instalmente, os nulos são um dos piores pesadelos do desenvolvedor e causar um grande número de erros no momento do aplicativo. A falta de ferramentas para tratá-las apropriadamente torna a coexistência com as ovelhas negras dos valores possíveis a serem aplicadas a uma variável. Neste artigo no manual do .NET, vamos tentar lançar um pouco de luz e dizer-lhe as soluções que a tecnologia nos oferece para viver com os valores nulos.
e é com pouco que você desenvolveu Tem certeza de que você já encontrou a difícil tarefa de atribuir um valor nulo a uma variável do tipo de valor (int, float, char …) onde não se encaixa mais do que usar truques difíceis de executar, rastrear e documentos. Por exemplo, dada uma classe de classe com uma propriedade tipo inteiro chamada idade, o que acontece se fizermos um objeto da referida classe de um banco de dados se o campo não era obrigatório nisso?
a priori, fácil: Ao ler no banco de dados, verificamos se é nulo e, nesse caso, atribuímos à propriedade do valor da classe -1. Bom patch, sem dúvida.
No entanto, opting geral por esta ideia apresenta várias desvantagens. Primeiro, para ser fiel à realidade, se gostaríamos de armazenar novamente este objeto no banco de dados, a mudança inversa deve ser feita, ou seja, para verificar se a idade é -1 e, nesse caso, salve no campo um nulo.
Segundo, consertou que estamos levando aos artefícios de classe que não fazem sentido no domínio do problema a ser resolvido, na entidade a que representa. Olhando para ele um pouco de longe, qual é o significado de uma idade negativa em uma entidade de uma pessoa? Nenhum.
Terceiro, há um problema de consistência nas consultas. Se eu tiver uma coleção de pessoas na memória (realizada, por exemplo, usando tipos genéricos) e eu quero saber aqueles que são definidos a idade, deve verificar cada elemento se sua idade da propriedade vale a pena -1; No entanto, ao executar a mesma consulta no banco de dados, você deve pedir o valor nulo no campo correspondente.
True é que também poderíamos trazer o conceito para o banco de dados o conceito “-1 significa nulo” em O campo etário, mas … não estaríamos espirrando a estrutura de dados com uma particularidade (e limitação) da linguagem de programação usada? Outra idéia bizarra poderia ser para introduzir idade em uma string e problemas resolvidos: as correntes, sendo um tipo de referência, pode conter nulos sem problemas, no entanto, é necessário reconhecer que as ordenações seriam regulares;
por Por último, e se em vez de idade, onde claramente não pode haver negativos, estávamos falando sobre a classe de contador de histórias e sua propriedade dardal? Aqui está claramente visto que o uso de negativos não é um recurso válido.
Soluções, além dos comentados, há para todos os gostos. Poderia, por exemplo, adicionar uma propriedade booleana paralela que indicada se o campo etário for nulo (um trabalho extra, especialmente sem várias propriedades, esses valores são), ou encapsulam a idade dentro de uma classe que incorpora o tratamento lógico deste nulo.
Em qualquer caso, possíveis soluções são trabalhadores, às vezes complexas, e acima de tudo, muito artificial para ser algo como todos os dias, como é um simples campo nulo.
Ciente, C # Designers já levaram em conta em sua versão 2.0 um recurso interessante: tipos anuláveis ou tipos canceláveis, um mecanismo que permite a nula em nossas vidas de maneira não traumática.
A próxima linha gerou um erro Compilação, que dizia, e não faltou razão, que “não pode ser convertida nula em ‘int’ porque é um tipo de valor”:
int s = nulo;
do C # 2.0, é possível fazer o seguinte:
int? s;
S = null;
S = 1;
Observe o interrogatório com o tipo, que é a indicação de que a variável S é inteira, mas também suporta um valor nulo.
no interior, isso funciona da seguinte forma: int? É um alias do sistema genérico. NUNLÍVEL. Na verdade, poderíamos usar indistintamente das duas maneiras de expressá-lo. Internamente uma estrutura é criada com duas propriedades somente leitura: HasValue, que retorna se a variável em questão tiver valor e valor, que contém o próprio valor.
Entende-se que uma variável com Hasvalue igual a False contém o valor nulo e, se tentarmos acessá-lo através do valor, uma exceção será lançada.
No entanto, a principal vantagem que eles têm é que eles são usados como se fosse um tipo de valor tradicional. Os tipos canceláveis se comportam praticamente como eles e oferecem aos mesmos operadores, embora tenham que levar em conta suas particularidades, como pode ser visto no seguinte código:
int?A = 1;
int? b = 2;
int? Intnulo = null;
bool? Sim = verdadeiro;
bool? Não = falso;
bool? Nisinino = null;
console.writine (A + B); // 3
console.writine (A + Intnulo); // nada, é null e console.writine (A * Intnulo); // nada, é null e console.writine (se & não); // false
console.writeline (se & não); // verdadeiro
console.writine (sim & nisinino); // nada, é null e console.writine (não & nisinino); // falso e console.writine (si | nisinino); // verdadeiro console.writine (não | nisinino); // nada, é nulo
podemos criar tipos canceláveis de qualquer tipo de quadro: int?, float?, duplo?, char?, etc.
e de fato, como tipos de valor que são, também podemos fazê-lo com enumerações. O exemplo a seguir seria incorreto:
estado estado1 = status.correct;
Estado Estado2 = null;
A segunda linha faz com que o erro na compilação “Nulo não pode ser convertido em ‘consoloplication1.program.state’ porque é um tipo de valor “. Lógico, é o mesmo que, se tentássemos atribuir o maldito valor nulo a um inteiro.
Isso pode causar um leve desconforto para o gerenciamento de valores “indeterminados”, já que seria necessário, por exemplo, Use outro membro da enumeração para representar esse valor, como no seguinte código no Visual Basic .NET:
Public enum estado para indeterminação = 0 correto = 1
Incorreto = 2
END enum
No entanto, há momentos em que é mais interessante ser capaz de ter um valor nulo como uma opção para as variáveis do tipo de nossa enumeração. Para fazer isso, podemos usar a mesma sintaxe que já vimos:
‘vb.net
dim status1 como nullable (de estado) = estado.Correct
estado2 = nada // c // c Estado #
? Estado1 = status.correct; status? Estado2 = null;