2010-11-17 2 views
5

Я разработчик C#/asp.net, и мне приходится работать на VB/asp.net. Я начал с VB.NET, но через несколько лет от него я запутался в синтаксисе.Сравнение нулевых значений DateTime в VB.net

У меня есть две переменных

Dim originalDate as DateTime? 
Dim newDate as DateTime? 

Оба NULLABLE DateTimes, originalDate является обнуляемой датой я получаю из базы данных и newDate время устанавливается в коде, мне нужно, чтобы сравнить их, они могут либо оба имеют даты , ни даты, ни один нет, а другой нет.

У меня есть немного кода следующим образом:

if origEndDate = origEndDate then 

Когда оба origEndDate и origEndDate не «ничего» это утверждение ложно (ну, когда я запускаю его в окне просмотра он возвращается в ничто)!

Я не понимаю, почему это так, потому что я был под впечатлением, делая «=», сравнивая эти два значения, и поскольку они одинаковы, это должно быть верно?

Может кто-нибудь объяснить, что я делаю неправильно? Какой синтаксис я должен использовать, как в C#, я могу сделать это так:

if (origEndDate == origEndDate) { } 

и он вернется как истинный.

Confused!

Спасибо за помощь!

ответ

4

Попробуйте originalDate.Equals(newDate) возможно?

(Нет, это не приведет к NRE когда либо дата равно нуль, так как переменные фактически типа значенияNullable(Of DateTime) и поэтому не фактически нуля, пока они зажаты.)

+0

Что такое NRE? как этот метод, так и object.equals (originalDate, newDate) работает .., который я должен использовать? – Bex

+0

NullReferenceException. Я бы использовал этот метод, так как он будет использовать переопределение типа 'Nullable (Of DateTime)', которое будет быстрее, чем использование сравнения типов значений по умолчанию. – cdhowie

+0

это имеет смысл ..! Но почему прямой «=» не работает, как в C# (ну == в C#)? – Bex

2

использование Object.equals (originalDate, newDate)

+1

это работает, но так ли и ответ ниже, не имеет значения в этом случае, какие типы переменных имеют как originalDate, так и newDate, так как я могу использовать это в других местах или только для nullables? – Bex

+1

@Bex, мне нужно будет взглянуть с рефлектором, как работают .Equals по типу даты, но я думаю, что это просто вызов Object.Equals, Object.Equals будет работать с ЛЮБЫМ видом объекта – Fredou

+1

'object.Equals' будет работать в любом дело. Вам это действительно нужно, когда любой параметр может быть нулевым (за исключением случаев unboxed nullables, которые никогда не являются * фактически * null). В противном случае использование метода '.Equals()' на одном из объектов будет немного быстрее. – cdhowie

2

Использования GetValueOrDefault будет обрабатывать случай, когда обе даты являются недействительными

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

в противном случае, вы можете проверить комбинацию HasValue разобраться, когда сроки не определены.

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

Итак, каково было значение по умолчанию для целочисленного значения? 0? Означает ли это, что если у моего объекта нет значения, я получаю 0, когда я использую GetValueOrDefault? – Marko

1

Я обнаружил, что Date.Equals работает для равенства, но есть arn't любые методы для других операторов (< или>, например).

Если вам нужно сравнить для больше или меньше, чем вам нужно использовать:

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

я решил стандартизировать все мой код, чтобы использовать этот метод, ради консистенции в. Так что теперь мои проверки равенства имеют тот же формат, что и выше, например:

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

Использование Nullable Class methods, когда вам нужно знать, если два Nullables равны

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 

Также вы можете проверить больше, меньше

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 
Смежные вопросы