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 useIs Nothing
oIsNot 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
paraInteger
,False
paraBoolean
,DateTime.MinValue
paraDateTime
, ... - 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 equivalentemented = 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