Resumo : neste tutorial, você aprenderá sobre o tipo C# Nullable Value e como usá-lo de forma eficaz.
Introdução ao tipo de valor anulável C#
O seguinte declara uma variável isCompleted
com o bool
tipo e inicializa seu valor como false
:
using static System.Console;
bool isCompleted = false;
WriteLine(isCompleted);
Linguagem de código: C# ( cs )
Como a isCompleted
variável tem type bool
, você pode atribuir um true
ou false
a ela:
using static System.Console;
bool isCompleted = false ;
isCompleted = true;
WriteLine(isCompleted);
Linguagem de código: C# ( cs )
Mas as coisas ficam mais complicadas quando você trabalha com dados externos, como o resultado de uma chamada de API ou o conjunto de resultados de um banco de dados.
Se os dados provenientes do banco de dados NULL
não forem verdadeiros ou falsos, você não poderá atribuí-los à isCompleted
variável. Se você tentar fazer isso, receberá um erro como este:
using static System.Console;
bool isCompleted = false ;
// Error: Cannot convert null to 'bool'
// because it is a non-nullable value type
isCompleted = null; // null comes from DB
WriteLine(isCompleted);
Linguagem de código: C# ( cs )
Este problema ocorre não apenas no tipo bool, mas também em outros tipos como int, string, decimal, etc.
Para resolver esse problema, C# introduz o tipo de valor anulável . Observe que também temos um tipo de referência anulável que será abordado posteriormente.
Um tipo de valor anulável T?
representa todos os valores do tipo de valor subjacente T
e um null
valor adicional. O valor padrão de um tipo de valor anulável T?
é null
.
Por exemplo, bool?
a variável pode aceitar um de três valores: true
, false
, ou null
:
using static System.Console;
bool? isCompleted = false ;
isCompleted = null; // OK
WriteLine(isCompleted);
Linguagem de código: C# ( cs )
Para tornar um tipo de valor ( T
) anulável, você pode anexar um ponto de interrogação ( ?
) ao tipo da seguinte maneira:
T?
Linguagem de código: C# ( cs )
Por exemplo:
int?, decimal?
Linguagem de código: C# ( cs )
Tecnicamente, qualquer tipo de valor anulável é uma instância do genérico System.Nullable<T>
. Portanto, são equivalentes:
bool? isCompleted;
Linguagem de código: C# ( cs )
E
Nullable<bool> isCompleted;
Linguagem de código: C# ( cs )
Na prática, você raramente usará o Nullable<T>
tipo. Em vez disso, você usará T?
porque é mais conciso.
Propriedades de tipo de valor anulável C#
O Nullable<T>.HasValue
retorno true
se o objeto tiver um valor de seu tipo subjacente ( T
) ou false
não. Por exemplo:
using static System.Console;
int? count = null;
WriteLine(count.HasValue); // False
count = 1;
WriteLine(count.HasValue); // True
Linguagem de código: C# ( cs )
Neste exemplo, the count.HasValue
retorna false
porque the count
é null
inicialmente. Mas depois de atribuir um número inteiro ( 1
), ele HasValue
retorna true
.
Se a HasValue
propriedade retornar true
, você poderá obter o valor do tipo subjacente usando a Nullable<T>.Value
propriedade:
using static System.Console;
int? count = 1;
if (count.HasValue)
{
WriteLine(count.Value); // 1
}
Linguagem de código: C# ( cs )
Neste exemplo, a count
variável tem o valor, 1
portanto a HasValue
propriedade retorna true
e Value
retorna 1.
Se HasValue
retornar false
e você acessar a Value
propriedade, receberá uma InvalidOperationException
exceção.
Da mesma forma, você pode comparar um objeto do tipo de valor anulável com null
em vez de usar a HasValue
propriedade conforme mostrado no exemplo a seguir:
using static System.Console;
int? count = 1;
if (count is not null)
{
WriteLine(count.Value); // 1
}
Linguagem de código: C# ( cs )
Resumo
Nullable<T>
pode conter valores do valor subjacenteT
enull
do valor adicional.- Use a
Nullable<T>.HasValue
propriedade para verificar se uma instância deNullable<T>
contém um valor do tipo subjacenteT
. - Use
Nullable<T>.Value
propriedade para acessar o valor da instância deNullable<T>
quando aNullable<T>.HasValue
propriedade étrue
.