C# - Fundamentos : Definindo DateTime como Null


 Na série C# Fundamentos vou abordar os conceitos básicos da linguagem C#. Hoje veremos como definir objetos do tipo DateTime como Null.

É possível definir um objeto DateTime para null em C# ?

Quando um tipo pode ser atribuído com um null ele é chamado de anulável, isso significa que o tipo não tem valor. Todos os tipos de referência, como string, são anuláveis por padrão enquanto que todos os tipos por valor, como int, double, etc., não são anuláveis.

Assim concluímos que a resposta a essa pergunta será: Não, porque DateTime é um tipo de valor.

Assim, DateTime é um Tipo de Valor como int, double etc., e portanto, não há como atribuir um valor nulo ao um objeto DateTime.

Atribuindo null a um objeto DateTime

Acabei de escrever que não podemos atribuir um valor null a um objeto do tipo DateTime, mas podemos contornar esse problema da seguinte forma: duas maneiras de contornar esse problema:

  1. Tornar o tipo Anulável (Nullable Type)

Os nullabe Types ou Tipos Anuláveis permitem que você crie um tipo por valor que pode ser marcado como válido ou inválido de forma que você tenha certeza que a variável seja válida antes de ser usada.Tipos de valores regulares são chamados de tipos não anuláveis.

Por padrão DateTime não é anulável porque é um tipo de valor, usando o operador nullable introduzido no C# 2.0 , podemos tornar um objeto DateTime um nullable type.

Fazemo isso usando um ponto de interrogação (?) após o tipo ou usando o estilo genérico Nullable<T>:

 

    Nullable<DateTime> DataNascimento = null;
    DateTime? DataAtual = null;

 

Obs: Tipos anulável são instâncias da struct System.Nullable .

Usando esse recurso podemos tratar os objetos DateTime como mostra o exemplo abaixo:

using System;
namespace CSharp_Erros1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Declara uma instância de DateTime nullable e atribui um null
            // A seguir altera o valor de DateTime e usa o método Teste
            DateTime ? valor = null;
            Teste(valor);
            valor = DateTime.Now;
            Teste(valor);
            valor = DateTime.Now.AddDays(1);
            Teste(valor);
            // Podemos usar método GetValueOrDefault com null
            valor = null;
            Console.WriteLine(valor.GetValueOrDefault());
            Console.ReadLine();
        }
        static void Teste(DateTime? valor)
        {
            // Usa a propriedade HasValue
            // Se não existir um valor imprime zero(0)
            if (valor.HasValue)
                Console.WriteLine(valor.Value);
            else
                Console.WriteLine(0);
        }
    }
}

-O primeiro valor será zero pois o HasValue  para null vai ser false

-O segundo valor refere-se ao valor DateTime.Now atribuido

-O terceiro valor refere-se ao valor atribuído por DateTime.Now.AddDays(1)

-O quarto valor refere-se ao retorno de GetValueOrDefault() que retorna  DateTime.MinValue para um valor null.

No exemplo temos dois métodos :

  1. Main();
  2. Teste() que usa o DateTime anulável como um parâmetro;

A variável "DateTime?" é declarada primeiro no corpo do método Main e passada como um parâmetro para o método de Teste().

A seguir atribuimos valores diferentes à variável "DateTime?" :

  valor = DateTime.Now;
  valor = DateTime.Now.AddDays(1);

Além disso usamo o método GetValueOrDefault que retornará um DateTime.MinValue para um DateTime nulo.

No método Teste() estamos recebendo um parâmetro do tipo DateTime anulável e usando a propriedade HasValue que esta disponível em qualquer tipo anulável.

Ela vai retornar true se o tipo anulável for não nulo e false se o campo nulo no tipo anulável estiver ativado.

E estamos conversados...

'Disse-lhe Jesus: Não te hei dito que, se creres, verás a glória de Deus? '
João 11:40

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti