O que significa “DateTime?” Em C #?

Eu estou lendo um livro .Net, e em um dos exemplos de código, há uma definição de class com este campo:

private DateTime? startdate 

O que faz o DateTime? significar?

Como DateTime é uma struct , não uma class , você obtém um object DateTime , não uma referência , ao declarar um campo ou uma variável desse tipo. E, da mesma forma que um int não pode ser null , então este object DateTime nunca será nulo, porque não é uma referência.

Adicionar o ponto de interrogação o transforma em um tipo anulável , o que significa que ele é um object DateTime ou é null .

DateTime? é açúcar sintático para Nullable , onde Nullable é em si uma struct .

É um DateTime anulável. ? depois que um tipo / estrutura primitiva indica que é a versão anulável.

DateTime é uma estrutura que nunca pode ser nula. Do MSDN :

O tipo de valor DateTime representa datas e horas com valores que variam de 12:00:00 à meia-noite de 1 de janeiro de 0001 Anno Domini ou AD (também conhecido como Era Comum ou CE) até às 23:59:59 de 31 de dezembro de 9999 AD (CE)

DateTime? pode ser nulo no entanto.

Um ? como um sufixo para um tipo de valor permite atribuições nulas que seriam impossíveis em outro sentido.

http://msdn.microsoft.com/pt-br/library/b3h38hb0.aspx

Representa um object cujo tipo subjacente é um tipo de valor que também pode ser atribuído a uma referência nula.

Isso significa que você pode escrever algo assim:

  DateTime? a = null; if (!a.HasValue) { a = DateTime.Now; if (a.HasValue) { Console.WriteLine(a.Value); } } 

Data hora? é sintaticamente equivalente a Nullable .

É equivalente a Nullable . Você pode acrescentar “?” para qualquer tipo primitivo ou struct.

basicamente fornece um estado extra para primitivos. Pode ser um valor ou pode ser nulo. Pode ser útil em situações em que um valor não precisa ser atribuído. Então, ao invés de usar, por exemplo, datetime.min ou max, você pode atribuir nulo para representar nenhum valor.

Como sabemos, DateTime é uma estrutura significa que DateTime é um tipo de valor, então você obtém um object DateTime, não uma referência porque DateTime não é uma class, quando você declara um campo ou variável desse tipo você não pode inicializar com null não aceita null. Da mesma forma que um int não pode ser nulo. então o object DateTime nunca será nulo, porque não é uma referência.

Mas às vezes precisamos de variável anulável ou campo de tipos de valor, nesse momento usamos ponto de interrogação para torná-los do tipo anulável, de modo que eles permitem nulo.

Por exemplo:-

Data hora? date = null;

int? intvalue = nulo;

No código acima, data variável é um object de DateTime ou é nulo. O mesmo para intvalue.