Замена для «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

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

1
nl ja de
Проверка на selectedID равна 0 , написав selectedID = Nothing , что-то действительно аберрантное.
добавлено автор Teejay, источник
Основным вспомогательным методом является Microsoft.VisualBasic.CompilerServices.Operators :: Conditiona & zwnj; lCompareObjectEqual (& zwnj;). Под ним находится код vast .
добавлено автор Hans Passant, источник
Пробовали ли вы Если выбраноID Nothing, то ?
добавлено автор MarcinJuraszek, источник
@MarcinJuraszek да, я сделал, но 0 не ничего, так что это не сработает.
добавлено автор Jonathan, источник

2 ответы

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

Dim selectedID As Integer? = nothing

...

if selectedID isnot nothing then

    dim value as integer = selectedID.value
    ...

end if

Другим способом проверки типа с нулевым значением было присвоено значение.

if selectedID.hasValue = true then

   dim value as integer = selectedID.value
   ...

end if
1
добавлено
Ах, не очень внимательно прочитал ваш вопрос.
добавлено автор Ceres, источник
К сожалению, я не могу гарантировать, что это будет целое число. Это может быть дата или строка, или какой-либо другой тип целиком.
добавлено автор Jonathan, источник

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

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
0
добавлено
Или используйте этот подход .
добавлено автор Neolisk, источник
Я получаю вашу борьбу здесь и понимаю, почему вы пошли с этим неуклюжим подходом. Однако можете ли вы указать, почему использование ConditionalCompareObjectEqual (), как предлагает Ханс Пассант, не подходит?
добавлено автор rskar, источник
Это неизбежно подходит, но я этого не осознавал. Я предположил, что он недоступен, и Ганс просто дал мне понять, что была проделана большая работа по функциональности, которую я не мог использовать.
добавлено автор Jonathan, источник
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)