¿Qué significa “DateTime?” En C #?

Estoy leyendo un libro de .Net, y en uno de los ejemplos de código hay una definición de clase con este campo:

private DateTime? startdate 

¿Qué es DateTime? ¿media?

Como DateTime es una struct , no una class , obtienes un objeto DateTime , no una referencia , cuando declaras un campo o variable de ese tipo. Y, del mismo modo que un int no puede ser null , este objeto DateTime tampoco puede ser nulo, porque no es una referencia.

Agregar el signo de interrogación lo convierte en un tipo anulable , lo que significa que o bien es un objeto DateTime o es null .

DateTime? es azúcar sintáctica para Nullable , donde Nullable es en sí mismo una struct .

Es un DateTime que se puede nulos. ? después de un tipo / estructura primitiva indica que es la versión que admite nulos.

DateTime es una estructura que nunca puede ser nula. Desde MSDN :

El tipo de valor DateTime representa fechas y horas con valores que van desde las 12:00:00 de la medianoche, el 1 de enero de 0001 Anno Domini o AD (también conocido como Era común o CE) hasta las 11:59:59 p. M., El 31 de diciembre de 1999. AD (CE)

DateTime? puede ser nulo sin embargo.

A ? como un sufijo para un tipo de valor permite asignaciones nulas que serían de otro modo imposibles.

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

Representa un objeto cuyo tipo subyacente es un tipo de valor al que también se le puede asignar una referencia nula.

Esto significa que puedes escribir algo como esto:

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

¿Fecha y hora? es sintácticamente equivalente a Nullable .

Es equivalente a Nullable . Puede agregar “?” a cualquier tipo o estructura primitiva.

básicamente te da un estado extra para primitivos. Puede ser un valor, o puede ser nulo. Puede ser útil en situaciones donde no es necesario asignar un valor. Entonces, en lugar de usar, por ejemplo, datetime.min o max, puede asignarle null para que no represente ningún valor.

Como sabemos, DateTime es una estructura significa que DateTime es un tipo de valor, por lo que obtienes un objeto DateTime, no una referencia porque DateTime no es una clase, cuando declaras un campo o variable de ese tipo no puedes inicializar con tipos de valor nulos. no acepte nulo Del mismo modo que un int no puede ser nulo. por lo que el objeto DateTime nunca será nulo, porque no es una referencia.

Pero a veces necesitamos tipos de variables con nulos o campos de valores, esa vez usamos el signo de interrogación para convertirlos en tipos con nulos, por lo que permiten el nulo.

Por ejemplo:-

¿Fecha y hora? date = null;

¿En t? intvalue = null;

En el código anterior, la fecha variable es un objeto de DateTime o es nulo. Lo mismo para intvalue.