Tipo de valor anulável C#

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 booltipo e inicializa seu valor como false:

using static System.Console;

bool isCompleted = false;
WriteLine(isCompleted);Linguagem de código:  C#  ( cs )

Como a isCompletedvariável tem type bool, você pode atribuir um trueou falsea 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 NULLnão forem verdadeiros ou falsos, você não poderá atribuí-los à isCompletedvariá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 Te um nullvalor 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>.HasValueretorno truese o objeto tiver um valor de seu tipo subjacente ( T) ou falsenão. Por exemplo:

using static System.Console;

int? count = null;
WriteLine(count.HasValue); // False

count = 1;
WriteLine(count.HasValue); // TrueLinguagem de código:  C#  ( cs )

Neste exemplo, the count.HasValueretorna false porque the counté nullinicialmente. Mas depois de atribuir um número inteiro ( 1), ele HasValueretorna true.

Se a HasValuepropriedade retornar true, você poderá obter o valor do tipo subjacente usando a Nullable<T>.Valuepropriedade:

using static System.Console;

int? count = 1;
if (count.HasValue)
{
    WriteLine(count.Value); // 1
}Linguagem de código:  C#  ( cs )

Neste exemplo, a countvariável tem o valor, 1portanto a HasValuepropriedade retorna truee Valueretorna 1.

Se HasValueretornar falsee você acessar a Valuepropriedade, receberá uma InvalidOperationExceptionexceção.

Da mesma forma, você pode comparar um objeto do tipo de valor anulável com nullem vez de usar a HasValuepropriedade 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 subjacente Te nulldo valor adicional.
  • Use a Nullable<T>.HasValuepropriedade para verificar se uma instância de Nullable<T>contém um valor do tipo subjacente T.
  • Use Nullable<T>.Valuepropriedade para acessar o valor da instância de Nullable<T>quando a Nullable<T>.HasValuepropriedade é true.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *