Pergunta

Estou um pouco confuso sobre valores nulos e variáveis ??em .NET. (VB preferido)

Existe alguma maneira de verificar a "nullness" de qualquer variável dada independentemente de que era um objeto ou um tipo de valor? Ou será que o meu cheque nulo tem que sempre antecipar se está verificando um tipo de valor (por exemplo System.Integer) ou um objeto?

Eu acho que o que eu estou procurando é uma função que verifica todos os tipos possíveis de null-ness. Ou seja, qualquer tipo de variáveis ??que

a) não foi atribuído um valor desde declarou

b) foi atribuído um valor nulo a partir de um objeto de dados (que veio de um banco de dados)

c) foram colocados em iguais a um outro valor variável que foi nula

d) foram ajustados para uma variável de sessão / aplicação ASP.NET que nunca foi definida ou expirado.

Existe uma melhor prática geral, quando se trata de lidar com cenários nulos em .NET?

UPDATE: Quando falo de um tipo de valor a ser "nulo", o que eu realmente quero dizer é um tipo de valor que, ou nunca foi definida ou foi em algum conjunto de pontos igual ou fundido a partir de um nulo objeto.

Foi útil?

Solução

tipos valor normal (booleanos, ints, longs, float, double, enum e estruturas) não são anulável.

O valor padrão para todos os tipos de valor é 0.

O CLR não vai deixar você acessar variáveis ??a menos que tenham sido set. Você pode pensar que este não é sempre o caso, mas às vezes o CLR etapas e inicializa-los para você. Em um nível método você deve inicializar explicitamente todas as variáveis ??antes de serem usados.

Além disso, como outros apontam, desde .net 2.0, há um novo tipo genérico chamado Nullable<T>. Existem alguns atalhos do compilador em C # como int? meios Nullable<int>, double? meios Nullable<double> etc.

Você só pode embrulhar Nullable<T> sobre tipos de valor não nulo, que é bom desde referências já têm a capacidade de ser nulo.

int? x = null;

Para uma int ?, enquanto você pode testar contra null, às vezes é mais agradável para x.HasValue() chamada.

Em C # há também a anulável coalescente operador ?? quando você deseja atribuir um valor nulo para um tipo de valor não nulo. Mas se você não tem o operador, você pode chamar GetValueOrDefault ().

int y = x ?? 2; // y becomes 2 if x is null.
int z = x.GetValueOrDefault(2); // same as y

Outras dicas

Tipos

Valor não pode ser nulo. Isso viola o que significa ser um tipo de valor. Você pode embrulhar tipos de valor como Nullable (Of T), que lhe dá um grande conjunto de métodos, e verifica Nada fazer o trabalho. Mas você tem um monte de sobrecarga com que wrapper. Talvez você possa esclarecer o que você está tentando fazer?

Para completar a sintaxe VB para wrappers anuláveis ??é:

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0'
Dim j as Integer? = Nothing '.NET 3.5'

EDIT:. Tipo do valor são sempre preinitialized para um valor padrão, 0 para valores numéricos, falsa para Booleans, etc

É isso que você está depois?

if IsNothing(foo) OrElse IsDbNull(foo) Then
    ' Do Something Because foo Is Either Nothing or DBNull.Value
End If

Na verdade eu não estou certo por que você deseja para esta estrutura. A única vez que eu iria verificar para DBNull.Value é quando eu estou usando valores que vieram de um banco de dados, e antes que eu atribuir disse valor a partir de uma classe de dados Namespace para alguma outra classe [isto é dim b como cadeia = dataReader (0)].

Normalmente, se você está preocupado com um objeto não tendo sido instanciado, ou que necessitem que seja instanciado-re, em seguida, apenas uma verificação IsNothing será suficiente.

Na Net que são apenas dois tipos de nulo que estou ciente de, nula (nada em VB) e DbNull. Se você estiver usando uma System.Nullable, você pode usar a mesma sintaxe nula controlo, tal como faria com um objeto. Se se o seu objeto nulo é encaixotado 2.0 CLR Net é inteligente o suficiente para descobrir o caminho certo para lidar com isso.

O único caso que eu ter executado em ambos os tipos é na camada de dados de uma aplicação onde eu poderia estar a aceder aos dados do banco de dados diretamente. Por exemplo, eu tenho que correr em DbNull em um DataTable. Para verificar se esses dois tipos nulos neste situration, você poderia escrever um método de extensão como (desculpe, em C #):

static public bool IsNull(this object obj)
{
    return obj != null && obj != DbNull.Value;
}

...

if(dataTable[0]["MyColumn"].IsNull())
{
  //do something
}
variáveis ??do tipo

Valor não pode conter nulo, isso é porque o meio nulos, NULL significa que os pontos de referências a lugar nenhum. Eu não sei em VB.net, mas em c #, pode englobar tipos de valor a ser nullables usando o, como "?":

int? a = null;

Enquanto você está desenvolvendo com Option Strict On, (a) não deve ser um problema. O compilador vai gritar com você. Se você está preocupado com a verificação de parâmetros, basta usar

Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer)
    if param1 is nothing then
         Throw New ArgumentException("param1 cannot be null!")
    end if
    'param2 cannot be null
End Sub

Para (b), a sua camada de interação com o banco deve lidar com isso. Se você estiver usando LINQ, existem maneiras de lidar com isso. Se você estiver usando conjuntos de dados digitados, há uma propriedade .IsMyVariableNull na linha que fica auto-gerado.

Para (c), você não precisa se preocupar com os tipos de valor, mas os tipos de referência pode ser verificado com um simples é nada (ou IsNot Nada).

Para (d), você pode aplicar a mesma lógica após a leitura. Testar a variável receptora contra Nada.

Para a maior parte, uma simples verificação de há nada vai chegar perto. Sua camada de interação com o banco irá ajudá-lo a lidar com o caso mais rígidas de valores nulos em seus dados, mas é até você para tratá-los adequadamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top