2010-11-17 30 views
5

Soy un desarrollador de C#/asp.net y tengo que trabajar en un VB/asp.net. Empecé con VB.NET, pero después de varios años me confundo con la sintaxis.Comparando fecha y hora de NULL en VB.net

que tienen dos variables

Dim originalDate as DateTime? 
Dim newDate as DateTime? 

Ambos datetimes anulables, originalDate es una fecha anulable que estoy recibiendo de la base de datos y el tiempo NewDate se encuentra en el código, tengo que compararlas, que puede o ambos tienen fechas , tampoco tienen fechas o una tiene y otra no.

que tienen un poco de código de la siguiente manera:

if origEndDate = origEndDate then 

Cuando ambos origEndDate y origEndDate son "nada" esta afirmación es falsa (bueno cuando lo ejecuto en la ventana de inspección se vuelve como nada)!

No entiendo por qué este es el caso porque tenía la impresión de que al hacer una "=" se comparan los dos valores y, como son iguales, ¿debería ser así?

¿Alguien puede explicar lo que estoy haciendo mal? Lo sintaxis debo utilizar como en C# que pueda hacer lo anterior como así:

if (origEndDate == origEndDate) { } 

y que va a volver como verdadera.

Confused!

¡Gracias por cualquier ayuda!

Respuesta

4

Trate originalDate.Equals(newDate) tal vez?

(No, esto no causará una NRE cuando sea la fecha es nulo, ya que las variables son realmente del tipo valorNullable(Of DateTime) y por lo tanto no son realidad nula hasta que estén en caja.)

+0

¿Qué es un NRE? tanto este método como object.equals (originalDate, newDate) funciona ... ¿qué debería estar usando? – Bex

+0

NullReferenceException. Utilizaría este método, ya que utilizará la anulación en el tipo 'Nullable (Of DateTime)', que será más rápido que usar la comparación predeterminada basada en la reflexión de los tipos de valores. – cdhowie

+0

que tiene sentido ..! ¿Pero cómo es que el directo "=" no funciona como lo hace en C# (bueno == en C#)? – Bex

2

uso Object.equals (originalDate, NewDate)

+1

esto funciona, pero también lo hace la respuesta a continuación, ¿hay alguna diferencia en este caso qué tipo de variables son el original Date y newDate, como en puedo usar en otros lugares o solo para nullables? – Bex

+1

@Bex, necesitaría mirar con un reflector cómo funcionan los .Equals en el tipo de fecha, pero creo que es solo llamar a Object.Equals, Object.Equals funcionaría con CUALQUIER tipo de objeto – Fredou

+1

'object.Equals' funcionará en cualquier caso. Realmente solo lo necesita cuando cualquiera de los parámetros puede ser nulo (excepto en el caso de nulables sin caja, que nunca son * realmente * nulos). De lo contrario, usar el método '.Equals()' en uno de los objetos será un poco más rápido. – cdhowie

2

Uso GetValueOrDefault manejará el caso de que ambas fechas son nulos

Dim d1 As New Nullable(Of DateTime) 
Dim d2 As New Nullable(Of DateTime) 
If d1.GetValueOrDefault = d2.GetValueOrDefault Then 
    {do stuff} 
End If 

de lo contrario, se puede comprobar una combinación de HasValue de resolver cuando las fechas no están definidos.

If (Not d1.HasValue AndAlso Not d1.HasValue) OrElse (d1.HasValue AndAlso d2.HasValue AndAlso d1 = d2) Then 
    {do stuff} 
End If 
+0

Entonces, ¿cuál sería el valor predeterminado para el entero anulable? 0? ¿Eso significa que si mi objeto no tiene un valor, obtendría un 0 cuando utilizo GetValueOrDefault? – Marko

1

me encontré con que Date.Equals Cómo funciona la igualdad pero no arn't ningún método para otros operadores (< o> por ejemplo).

Si es necesario comparar una mayor o menor que es necesario utilizar:

If Date1.GetValueOrDefault > Date2.GetValueOrDefault Then 
    ... 
End If 

he decidido estandarizar todo mi código para utilizar este método para mantener la coherencia. Así que ahora mis cheques de igualdad tienen el mismo formato que el ejemplo anterior:

If Date1.GetValueOrDefault = Date2.GetValueOrDefault Then 
    ... 
End If 
1

Uso Nullable Class methods cuando se necesita para saber si dos nullables son iguales

Dim d1 As New Nullable(Of DateTime) 
Dim d2 As New Nullable(Of DateTime) 
Dim result As String = "Not Equal" 
If(Nullable.Equals(d1,d2)) 
    result = "Equal" 
End If 

También puede comprobar mayor que, menor que

Dim compareResult As Integer 
compareResult = Nullable.Compare(d1,d2) 
If(compareResult > 0) 
    result = "d1 greater than d2" 
Else If (compareResult < 0) 
    result = "d1 less than d2" 
Else 
    result = "d1 equal d2" 
End If