novo DateTime () vs padrão (DateTime)

196

Existe um motivo para escolher um desses sobre o outro?

DateTime myDate = new DateTime();

ou

DateTime myDate = default(DateTime);

Ambos são iguais 1/1/0001 12:00:00 AM.

RJP
fonte
28
O que é igual a DateTime.MinValue, então você também pode fazer DateTime myDate = DateTime.MinValueo mesmo: /
Lloyd
20
@Lloyd Na maioria das vezes ... mas não como um parâmetro padrão, DateTime.MinValue não é uma constante de tempo de compilação - mas o padrão (DateTime) / new DateTime () é.
Ricibob 29/08/19
12
Apenas para esclarecer o excelente comentário do @ Ricibob, porque é importante: se você estiver criando um método com um parâmetro opcional, poderá SOMENTE usar um default(DateTime)ou new DateTime(). Ambas são constantes de tempo de compilação , necessárias para valores de parâmetros opcionais. Se constantes de tempo de compilação não são necessários, em seguida default(DateTime), new DateTime()e DateTime.MinValuesão intercambiáveis.
Leanne

Respostas:

200

Não, eles são idênticos.

default(), para qualquer tipo de valor ( DateTimeé um tipo de valor) sempre chamará o construtor sem parâmetros.

Servy
fonte
29
FWIW; No C # 6, esse comportamento será alterado. O C # 6 apresenta construtores sem parâmetros para estruturas, que permitem que o comportamento newseja diferente do que default(T)fará.
Vcsjones
30
Pode-se argumentar que default(DateTime)é mais descritivo da intenção do programador e, portanto, mais favorável em geral.
Intrepidis
16
@vcsjones, isso foi removido antes do lançamento final do C # 6.0.
Nawfal 5/07
5
@nawfal Yeah. Provavelmente o melhor que aconteceu também.
Vcsjones
Esta resposta está errada IMO: as duas coisas são semanticamente idênticas, mas nenhuma delas chama um construtor - ambas as opções de sintaxe usaminitobj
Marc Gravell
22

Se você deseja usar o valor padrão para um parâmetro DateTime em um método, você pode usar apenas o padrão (DateTime).

A seguinte linha não será compilada:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Esta linha irá compilar:

    private void MyMethod(DateTime syncedTime = default(DateTime))
Tomer
fonte
3
Claro que o DateTime.MinValue não compila? Parâmetros opcionais devem ser constantes em tempo de compilação, o que MinValue não é. default (DateTime) e new DateTime () são válidos, porém. (o que é realmente engraçado, porque const DateTime x = default (DateTime) não é válido, pois os valores DateTime não podem ser declarados como constantes em tempo de compilação)
Jerri Kangasniemi
16

A resposta é não. Lembre-se de que, nos dois casos mdDate.Kind = DateTimeKind.Unspecified,.

Portanto, pode ser melhor fazer o seguinte:

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

A myDate.Kindpropriedade é somente leitura, portanto, não pode ser alterada após a chamada do construtor.

Ben C
fonte
2
como isso responde à pergunta do OP?
Mo Patel
46
Por favor, veja as 4 primeiras palavras da minha resposta.
Ben C
4
Eu argumentaria contra isso. O padrão DateTimeé útil como um valor não definido, com uma comparação simples com default(DateTime). Que uso é um 01/01/0001valor não padrão ?
Rawling
Tenha em mente que é DateTimeKind.Utc vez de DateTimeKind.Utc
Roberto
@ Roberto Obrigado, fixo.
jpaugh
-3

A maneira mais simples de entender é que DateTime é uma estrutura. Quando você inicializa uma estrutura, ela é inicializada com seu valor mínimo:DateTime.Min

Portanto, não há diferença entre default(DateTime)e new DateTime()eDateTime.Min

G.Busato
fonte
3
Não, as estruturas não são necessariamente inicializadas com seu valor mínimo. Eles são inicializados para todos os bits serem zero. Para alguns tipos, esse é o valor mais baixo; para outros, como tipos numéricos que podem ser negativos, não é nem perto do valor mínimo. E, claro, outros ainda não serão comparáveis ​​e não terão um valor "mínimo".
Servy