Existe uma maneira fácil no C # para verificar se uma instância DateTime foi atribuída a um valor ou não?
131
A única maneira de ter uma variável que não foi atribuída a um valor em C # é que ela seja uma variável local - nesse caso, no tempo de compilação, você pode dizer que ela não é definitivamente atribuída tentando ler a partir dela: )
Eu suspeito que você realmente deseja Nullable<DateTime>
(ou DateTime?
com o açúcar sintático em C #) - faça com que null
comece e atribua um DateTime
valor normal (que será convertido adequadamente). Em seguida, você pode simplesmente comparar com null
(ou usar a HasValue
propriedade) para ver se um valor "real" foi definido.
default(DateTime)
e um que era exatamente assim. Basicamente, trata um valor dentro do domínio como "especial e indisponível para uso normal", o que não gosto.você quer dizer assim:
ou você pode usar Nullable
fonte
coloque isso em algum lugar:
então:
fonte
IsEmpty
método irá retornar true, o que provavelmente não é o que você quer (porque é não vazio - ele foi atribuído o valor padrão). Eu acho que o nome do seu método seria mais adequado comoIsDefaultValue
. Desde que você realmente não pode ter um DateTime não nuloIsEmpty
.IsDefaultValue
teria sido melhorDateTime é o tipo de valor, portanto, nunca pode ser nulo. Se você acha o DateTime? (Anulável), você pode usar:
fonte
Acabei de descobrir que GetHashCode () para um datetime não atribuído é sempre zero. Não tenho certeza se essa é uma boa maneira de verificar se há data e hora nulas, porque não consigo encontrar nenhuma documentação sobre por que esse comportamento é exibido.
fonte
GetHashCode
0 retorno porque de carrapatos (representação interna de datetime) são também igual a 0. código hash calculado através da seguinte maneira:unchecked((int)ticks) ^ (int)(ticks >> 32);
. Também veja aqui: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836Use
Nullable<DateTime>
se possível.fonte
Eu diria que o valor padrão é sempre
new DateTime()
. Para que possamos escreverfonte
Geralmente, prefiro, sempre que possível, usar o valor padrão dos tipos de valor para determinar se eles foram definidos. Obviamente, isso não é possível o tempo todo, especialmente com ints - mas para DateTimes, acho que reservar o MinValue para significar que não foi alterado é justo o suficiente. O benefício disso em relação às nuláveis é que há um local a menos em que você obterá uma exceção de referência nula (e provavelmente em muitos lugares em que não é necessário procurar nulo antes de acessá-lo!)
fonte
Se você não precisa se preocupar com problemas de valor nulo, como verificar nulo toda vez que usá-lo ou agrupá-lo em alguma lógica, e também não deseja se preocupar com problemas de tempo de compensação, então isso é como eu resolvi o problema:
Acabei de verificar se o valor padrão é inferior a um dia após o início dos tempos. Funciona como um encanto.
fonte