Замена для If object = Nothing Then в строгом режиме VB.NET

У меня есть функция с параметром selectedID типа "объект".

Если мой параметр является значением по умолчанию для базового типа: т. е. целочисленное значение по умолчанию равно нулю, я хочу, чтобы какое-то действие имело место.

Без «Строгого включения» я могу использовать:

If selectedID = Nothing Then
    'Do Something
End If

Должен ли я сделать что-то вроде:

If (TypeOf selectedID Is Integer AndAlso selectedID.Equals(0)) _
OrElse (TypeOf selectedID Is String AndAlso selectedID.Equals(Nothing)) _
OrElse .. other types go here .. Then
    'Do something
End If

Или есть более простой метод, который мне не хватает?


person Jonathan    schedule 25.02.2013    source источник
comment
Вы пробовали If selectedID is Nothing then?   -  person MarcinJuraszek    schedule 25.02.2013
comment
Базовый вспомогательный метод — Microsoft.VisualBasic.CompilerServices.Operators::ConditionalCompareObjectEqual(). Под ним огромное количество кода.   -  person Hans Passant    schedule 25.02.2013
comment
@MarcinJuraszek да, я это сделал, но 0 - это не ничто, так что это не работает.   -  person Jonathan    schedule 26.02.2013
comment
Проверка на то, что selectedID равно 0, путем записи selectedID = Nothing является чем-то действительно ошибочным.   -  person Teejay    schedule 26.02.2013


Ответы (2)


В конце концов я реализовал предложение Neolisk, преимущество которого заключалось в том, что оно было коротким, всеобъемлющим и очень удобным для повторного использования:

Public Function IsDefaultObject(obj As Object) As Boolean
    Return obj.Equals(GetDefaultValue(obj.GetType()))
End Function

Public Function GetDefaultValue(t As Type) As Object
    If (t.IsValueType) Then Return Activator.CreateInstance(t)
    Return Nothing
End Function

Первоначально я решил создать функцию IsDefaultObject(obj), которая сообщает мне, было ли присвоено объекту значение по умолчанию. Я планировал добавить к нему по мере того, как будет замечено больше типов.

Private Function IsDefaultObject(obj As Object) As Boolean
    If obj Is Nothing Then Return True
    If String.IsNullOrEmpty(obj.ToString()) Then Return True
    If obj.Equals(0) Then Return True
    If obj.Equals(New Date()) Then Return True
    Return False
End Function

Конечно, я мог бы использовать решение в комментарии Ханса Пассанта:

Private Function IsDefaultObject(obj As Object) As Boolean
    Return Microsoft.VisualBasic.CompilerServices.Operators.
        ConditionalCompareObjectEqual(obj, Nothing, False)
End Function
person Jonathan    schedule 26.02.2013
comment
Я понимаю вашу борьбу здесь и понимаю, почему вы выбрали вышеупомянутый неуклюжий подход. Однако можете ли вы указать, почему использование ConditionalCompareObjectEqual(), как предлагает Ханс Пассант, не подходит? - person rskar; 26.02.2013
comment
Это неизбежно подходит, но я этого не осознавал. Я предположил, что это было недоступно, и что Ханс просто давал мне знать, что была проделана большая работа над функциональностью, которую я не мог использовать. - person Jonathan; 26.02.2013

Вы также можете использовать для этого тип с нулевым значением.

Dim selectedID As Integer? = nothing

...

if selectedID isnot nothing then

    dim value as integer = selectedID.value
    ...

end if

Другой способ проверить, что типу, допускающему значение NULL, присвоено значение.

if selectedID.hasValue = true then

   dim value as integer = selectedID.value
   ...

end if
person Ceres    schedule 26.02.2013
comment
К сожалению, я не могу гарантировать, что это будет целое число. Это может быть дата, строка или какой-то другой тип. - person Jonathan; 26.02.2013