una tres saber rango que otra net mayor horas hora fechas fecha esta entre ejemplos diferencia comparar vb.net datetime null nullable nothing

vb.net - tres - ¿Por qué no puedo verificar si un ''DateTime'' es ''Nothing''?



saber si una fecha es mayor que otra c# (8)

En VB.NET, ¿hay alguna manera de establecer una variable DateTime en "no establecida"? ¿Y por qué es posible establecer un DateTime en Nothing , pero no es posible verificar si es Nothing ? Por ejemplo:

Dim d As DateTime = Nothing Dim boolNotSet As Boolean = d Is Nothing

La segunda declaración arroja este error:

''Is'' operator does not accept operands of type ''Date''. Operands must be reference or nullable types.


Algunos ejemplos sobre cómo trabajar con valores de DateTime anular.

(Consulte Tipos de valores anulables (Visual Basic) para obtener más información).

'' '' An ordinary DateTime declaration. It is *not* nullable. Setting it to '' ''Nothing'' actually results in a non-null value. '' Dim d1 As DateTime = Nothing Console.WriteLine(String.Format("d1 = [{0}]/n", d1)) '' Output: d1 = [1/1/0001 12:00:00 AM] '' Console.WriteLine(String.Format("d1 is Nothing? [{0}]/n", (d1 Is Nothing))) '' '' Compilation error on above expression ''(d1 Is Nothing)'': '' '' ''Is'' operator does not accept operands of type ''Date''. '' Operands must be reference or nullable types. '' '' Three different but equivalent ways to declare a DateTime '' nullable: '' Dim d2? As DateTime = Nothing Console.WriteLine(String.Format("d2 = [{0}][{1}]/n", d2, (d2 Is Nothing))) '' Output: d2 = [][True] Dim d3 As DateTime? = Nothing Console.WriteLine(String.Format("d3 = [{0}][{1}]/n", d3, (d3 Is Nothing))) '' Output: d3 = [][True] Dim d4 As Nullable(Of DateTime) = Nothing Console.WriteLine(String.Format("d4 = [{0}][{1}]/n", d4, (d4 Is Nothing))) '' Output: d4 = [][True]

Además, sobre cómo comprobar si una variable es nula (desde Nothing (Visual Basic) ):

Al verificar si una variable de referencia (o tipo de valor anulable) es nula , no use = Nothing o <> Nothing . Siempre use Is Nothing o IsNot Nothing .

DateTime es un tipo de valor , lo que significa que siempre tiene algún valor.

Es como un entero: puede ser 0, o 1, o menos que cero, pero nunca puede ser "nada".

Si desea un DateTime que pueda tomar el valor Nothing, use un DateTime que se puede anular.


DateTime es un tipo de valor, por lo que no puede ser nulo. Puede verificar que sea igual a DateTime.MinValue , o puede usar Nullable(Of DateTime) lugar.

VB algunas veces "amablemente" te hace pensar que está haciendo algo que no es. Cuando te permite establecer una fecha en Nothing, en realidad está estableciéndolo en algún otro valor, tal vez MinValue.

Vea esta pregunta para una discusión extensa de los tipos de valores frente a los tipos de referencia.


En cualquier lenguaje de programación, tenga cuidado al usar valores nulos. El ejemplo anterior muestra otro problema. Si usa un tipo de Nullable, eso significa que las variables instanciadas de ese tipo pueden contener el valor System.DBNull.Value; no es que haya cambiado la interpretación de establecer el valor a predeterminado usando "= Nothing" o que el Object del valor ahora puede soportar una referencia nula. Solo una advertencia ... ¡feliz codificación!

Puede crear una clase separada que contenga un tipo de valor. Un objeto creado a partir de dicha clase sería un tipo de referencia, al que se le podría asignar Nada. Un ejemplo:

Public Class DateTimeNullable Private _value As DateTime ''properties Public Property Value() As DateTime Get Return _value End Get Set(ByVal value As DateTime) _value = value End Set End Property ''constructors Public Sub New() Value = DateTime.MinValue End Sub Public Sub New(ByVal dt As DateTime) Value = dt End Sub ''overridables Public Overrides Function ToString() As String Return Value.ToString() End Function

Clase final

''en Main ():

Dim dtn As DateTimeNullable = Nothing Dim strTest1 As String = "Falied" Dim strTest2 As String = "Failed" If dtn Is Nothing Then strTest1 = "Succeeded" dtn = New DateTimeNullable(DateTime.Now) If dtn Is Nothing Then strTest2 = "Succeeded" Console.WriteLine("test1: " & strTest1) Console.WriteLine("test2: " & strTest2) Console.WriteLine(".ToString() = " & dtn.ToString()) Console.WriteLine(".Value.ToString() = " & dtn.Value.ToString()) Console.ReadKey() '' Output: ''test1: Succeeded() ''test2: Failed() ''.ToString() = 4/10/2012 11:28:10 AM ''.Value.ToString() = 4/10/2012 11:28:10 AM

Luego, puede elegir y seleccionar las opciones para que haga lo que necesita. Mucho trabajo, pero si realmente lo necesita, puede hacerlo.


Esta es una de las mayores fuentes de confusión con VB.Net, IMO.

Nothing en VB.Net es el equivalente del default(T) en C #: el valor predeterminado para el tipo dado.

  • Para tipos de valor, esto es esencialmente el equivalente de ''cero'': 0 para Integer , False para Boolean , DateTime.MinValue para DateTime , ...
  • Para los tipos de referencia, es el valor null (una referencia que hace referencia a, bueno, nada).

La instrucción d Is Nothing es, por lo tanto, equivalente a d Is DateTime.MinValue , que obviamente no se compila.

Soluciones: como otros han dicho

  • ¿O usa DateTime? (es decir, Nullable(Of DateTime) ). Esta es mi solución preferida.
  • O use d = DateTime.MinValue o equivalentemente d = Nothing

En el contexto del código original, puedes usar:

Dim d As DateTime? = Nothing Dim boolNotSet As Boolean = d.HasValue


Puede verificar esto como a continuación:

if varDate = "#01/01/0001#" then '' blank date. do something. else '' Date is not blank. Do some other thing end if


También puede usar a continuación simplemente para verificar:

If startDate <> Nothing Then your logic End If

Verificará que la variable startDate del tipo de datos DateTime sea nula o no.


Una forma de evitar esto sería usar el tipo de datos Object en su lugar:

Private _myDate As Object Private Property MyDate As Date Get If IsNothing(_myDate) Then Return Nothing Return CDate(_myDate) End Get Set(value As Date) If date = Nothing Then _myDate = Nothing Return End If _myDate = value End Set End Property

Entonces puede configurar la fecha a nada como eso:

MyDate = Nothing Dim theDate As Date = MyDate If theDate = Nothing Then ''date is nothing End If