nuevo DateTime () vs predeterminado (DateTime)

196

¿Hay alguna razón para elegir uno de estos sobre el otro?

DateTime myDate = new DateTime();

o

DateTime myDate = default(DateTime);

Ambos son iguales 1/1/0001 12:00:00 AM.

RJP
fuente
28
Que es igual a DateTime.MinValue, por lo que también podría hacerlo DateTime myDate = DateTime.MinValuetambién: /
Lloyd
20
@Lloyd La mayor parte del tiempo ... pero no como un parámetro predeterminado DateTime.MinValue no es una constante de tiempo de compilación, pero el valor predeterminado (DateTime) / new DateTime () sí lo es.
Ricibob
12
Solo para aclarar el excelente comentario de @ Ricibob, porque es importante: si está creando un método con un parámetro opcional, SOLO puede usar cualquiera default(DateTime)o new DateTime(). Ambas son constantes de tiempo de compilación , necesarias para valores de parámetros opcionales. Si no se requieren constantes de tiempo de compilación, a continuación default(DateTime), new DateTime()y DateTime.MinValueson intercambiables.
leanne

Respuestas:

200

No, son idénticos.

default(), para cualquier tipo de valor ( DateTimees un tipo de valor) siempre llamará al constructor sin parámetros.

Servy
fuente
29
FWIW; En C # 6, este comportamiento cambiará. C # 6 introduce constructores sin parámetros para estructuras, que permiten que el comportamiento de newdifiera de lo default(T)que hará.
vcsjones
30
Se podría argumentar que default(DateTime)es más descriptivo de la intención del programador, por lo tanto, más favorable generalmente.
intrepidis
16
@vcsjones, esto se eliminó antes del lanzamiento final de C # 6.0.
nawfal
55
@nawfal Sí. Probablemente lo mejor que hizo también.
vcsjones
Esta respuesta es simplemente IMO incorrecta: las dos cosas son semánticamente idénticas, pero ninguna de las dos llama a un constructor - ambas opciones de sintaxis usaninitobj
Marc Gravell
22

Si desea usar el valor predeterminado para un parámetro DateTime en un método, solo puede usar el valor predeterminado (DateTime).

La siguiente línea no se compilará:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Esta línea compilará:

    private void MyMethod(DateTime syncedTime = default(DateTime))
Tomer
fuente
3
¿Por supuesto que DateTime.MinValue no se compila? Los parámetros opcionales deben ser constantes de tiempo de compilación, que MinValue no es. Sin embargo, default (DateTime) y new DateTime () son válidos (lo cual es divertido, porque const DateTime x = default (DateTime) no es válido, ya que los valores de DateTime no pueden declararse como constantes de tiempo de compilación)
Jerri Kangasniemi
16

La respuesta es no. Tenga en cuenta que en ambos casos mdDate.Kind = DateTimeKind.Unspecified.

Por lo tanto, puede ser mejor hacer lo siguiente:

DateTime myDate = new DateTime(1, 1, 1, 0, 0, 0, DateTimeKind.Utc);

La myDate.Kindpropiedad es de solo lectura, por lo que no se puede cambiar después de llamar al constructor.

Ben C
fuente
2
¿Cómo responde eso a la pregunta del OP?
Mo Patel
46
Por favor vea las primeras 4 palabras de mi respuesta.
Ben C
44
Yo argumentaría en contra de esto. El valor predeterminado DateTimees útil como un valor de valor no establecido, con una simple comparación con default(DateTime). ¿De qué sirve un 01/01/0001valor no predeterminado ?
Rawling
Tenga en cuenta que es DateTimeKind.Utc en lugar de DateTimeKind.UTC
Roberto
@Roberto Gracias, arreglado.
jpaugh
-3

La forma más sencilla de entenderlo es que DateTime es una estructura. Cuando inicializa una estructura, se inicializa a su valor mínimo:DateTime.Min

Por lo tanto no hay ninguna diferencia entre default(DateTime)y new DateTime()yDateTime.Min

G.Busato
fuente
3
No, las estructuras no se inicializan necesariamente a su valor mínimo. Se inicializan para que todos los bits sean cero. Para algunos tipos, ese es su valor más bajo, para otros, como los tipos numéricos que pueden ser negativos, no está cerca de su valor mínimo. Y, por supuesto, otros aún no serán comparables y no tendrán un valor "mínimo".
Servy