Nullable Types

Segundo o site da microsoft “Os tipos que permitem valor nulo representam todos os valores de um value type subjacente T e um valor null adicional.”

Tipo de valor contém os dados dentro de sua própria alocação de memória, isso significa que quando declaramos um desses tipos, um valor padrão é atribuído a variável.

Os Value Type incluem o seguinte:
– Todos os tipos de dados numéricos tais como: Boolean, Char e Date
– Todas as estruturas, mesmo se seus membros são tipos de referência tais como: enumerações, pois seu tipo subjacente é sempre SByte, Short, Integer, Long, Byte, UShort, UInteger, ou ULong.

Quando declaramos um tipo de valor, o .NET atribui um valor padrão como demonstrado no código abaixo.

using System;
namespace NullableSample
{
    class Program
    {
        static void Main(string[] args)
        {
            bool booleanVar = new bool();
            Console.WriteLine("booleanVar : " + booleanVar); // => booleanVar : False
            char[] charVar = new char[1];
            Console.WriteLine("charVar : " + charVar.GetValue(0)); // => charVar :
            DateTime dateVar = new DateTime();
            Console.WriteLine("dateVar : " + dateVar); // => dateVar : 01/01/0001 00:00:00
            sbyte SByteVar = new sbyte();
            Console.WriteLine("SByteVar : " + SByteVar); // => SByteVar : 0
            short ShortVar = new short();
            Console.WriteLine("ShortVar : " + ShortVar); // => ShortVar : 0
            int IntegerVar = new int();
            Console.WriteLine("IntegerVar : " + IntegerVar); // => IntegerVar : 0
            long LongVar = new long();
            Console.WriteLine("LongVar : " + LongVar); // => LongVar : 0
            byte ByteVar = new byte();
            Console.WriteLine("ByteVar : " + ByteVar); // => ByteVar : 0
            ushort UShortVar = new ushort();
            Console.WriteLine("UShortVar : " + UShortVar); // => UShortVar : 0
            uint UIntegerVar = new uint();
            Console.WriteLine("UIntegerVar : " + UIntegerVar); // => UIntegerVar : 0
            ulong ULongVar = new ulong();
            Console.WriteLine("ULongVar : " + ULongVar); // => ULongVar : 0
        }
    }
}

Se tentarmos atribuir um valor null para qualquer desses valore do exemplo, o visual studio mostra um erro como da imagem abaixo.

Declaração e atribuição

Para que um value type possa ser convertido implicitamente no tipo que permite valor nulo, você pode se referir a um tipo que permite valor nulo adicionando o “?” na frente da declaração de tipo.

Isso vai permitir que a variável contenha o valor ou seja null e ajuda a distinguir quando o valor ainda não foi atribuído.

Isso pode ser visto no exemplo abaixo

using System;
namespace NullableSample
{
    class Program
    {
        static void Main(string[] args)
        {
            int? IntegerVar = new int();
            Console.WriteLine("IntegerVar : " + IntegerVar); // => IntegerVar : 0
            IntegerVar = null;
            Console.WriteLine("IntegerVar : " + IntegerVar); // => IntegerVar : 
            int? IntegerVar2 = null;
            Console.WriteLine("IntegerVar : " + IntegerVar2); // => IntegerVar2 : 0
        }
    }
}

Algumas boas práticas

– Use em tipos simples para distinguir “não definido” e “valor padrão”
– Use propriedades do tipo como “HasValue” e “Value”, conforme necessário

DateTime dateVar = null;
if(dateVar.HasValue)
{
    DateTime dateVar2 = dateVar.Value;
}

– Evite usá-los se não for necessário

Qualquer dúvida ou dicas, entre em contato: leandrolt@gmail.com

Referência:
https://docs.microsoft.com/pt-br/dotnet/csharp/programming-guide/nullable-types/index
https://docs.microsoft.com/pt-br/dotnet/csharp/programming-guide/nullable-types/using-nullable-types
https://docs.microsoft.com/pt-br/dotnet/visual-basic/programming-guide/language-features/data-types/value-types-and-reference-types
http://www.macoratti.net/11/03/c_ntp.htm

Leave a Reply

Your email address will not be published. Required fields are marked *