2010-11-17 5 views
5

Je suis un développeur C#/asp.net et je dois travailler sur un VB/asp.net. J'ai commencé avec VB.NET, mais après des années d'absence, je suis confus avec la syntaxe.Comparer des DateTime nullables dans VB.net

J'ai deux variables

Dim originalDate as DateTime? 
Dim newDate as DateTime? 

Les deux datetimes nullables, originalDate est une date annulable que je reçois de la base de données et le temps newDate est définie dans le code, je dois les comparer, ils peuvent soit les deux ont des dates , ni ont des dates ou un ont et un pas.

J'ai un peu de code comme suit:

if origEndDate = origEndDate then 

Lorsque les deux origEndDate et origEndDate sont « rien » cette affirmation est fausse (bien quand je le lance dans la fenêtre de la montre, il revient comme rien)!

Je ne comprends pas pourquoi c'est le cas parce que j'étais sous l'impression de faire un "=" compare les deux valeurs et comme elles sont les mêmes sûrement il devrait être vrai? Est-ce que quelqu'un peut expliquer ce que je fais mal? Quelle syntaxe dois-je utiliser comme en C# Je peux faire ce qui précède comme tel:

if (origEndDate == origEndDate) { } 

et il reviendra comme vrai.

Confus!

Merci pour toute aide!

Répondre

4

Essayez originalDate.Equals(newDate) peut-être?

(Non, cela ne fera pas une NRE lorsque l'une date est nulle, puisque les variables sont en fait du type de valeur Nullable(Of DateTime) et ne sont donc pas effectivement nulle jusqu'à ce qu'ils soient encadrés.)

+0

Qu'est-ce qu'un NRE? à la fois cette méthode et object.equals (originalDate, newDate) fonctionne .. que dois-je utiliser? – Bex

+0

NullReferenceException. J'utiliserais cette méthode, car elle utilisera le remplacement sur le type 'Nullable (Of DateTime)', qui sera plus rapide que la comparaison basée sur la réflexion par défaut des types de valeurs. – cdhowie

+0

qui a du sens ..! Mais comment se fait-il que le "=" ne fonctionne pas comme dans C# (well == in C#)? – Bex

2

Object.equals d'utilisation (originalDate, newDate)

+1

cela fonctionne mais aussi la réponse ci-dessous, fait-elle une différence dans ce cas quel type de variables à la fois l'originalDate et newDate sont, comme dans puis-je utiliser dans d'autres endroits ou juste pour les valeurs nulles? – Bex

+1

@Bex, je aurais besoin de regarder avec réflecteur comment fonctionne le .Equals sur le type de date, mais je pense qu'il appelle simplement Object.Equals, Object.Equals fonctionnerait avec n'importe quel type d'objet – Fredou

+1

'object.Equals' fonctionnera dans tout Cas. Vous n'en avez vraiment besoin que lorsque l'un ou l'autre des paramètres peut être nul (sauf dans le cas des valeurs nulles non mises en boîte, qui ne sont jamais * réellement * nulles). Sinon, l'utilisation de la méthode '.Equals()' sur l'un des objets sera légèrement plus rapide. – cdhowie

2

aide GetValueOrDefault traitera le cas lorsque les deux dates sont nulles

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

Sinon, vous pouvez vérifier une combinaison de HasValue pour trier quand les dates ne sont pas définies.

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

Alors, quelle serait la valeur par défaut pour le nullable Integer? 0? Cela signifie-t-il que si mon objet n'a pas de valeur, j'obtiendrai un 0 lorsque j'utiliser GetValueOrDefault? – Marko

1

Je trouve que Date.Equals ne fonctionne pour l'égalité, mais il arn't des méthodes pour d'autres opérateurs (ou <> par exemple).

Si vous avez besoin de comparer pour plus ou moins que vous devez utiliser:

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

J'ai décidé de normaliser tout mon code pour utiliser cette méthode pour souci de cohérence. Alors maintenant, mes contrôles d'égalité ont le même format que l'exemple ci-dessus:

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

Utilisez Nullable Class methods lorsque vous avez besoin de savoir si deux Nullables sont égaux

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 

vous pouvez également vérifier plus que, moins

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 
Questions connexes