Самый безопасный способ проверить целое число

Вероятно, это скорее вопрос элегантности, чем функциональности. Я ищу самый безопасный способ проверить целое число из строки и объекта,

Использование большинства встроенных функций для этого в .net, похоже, генерирует исключение первого шанса, отображаемое в окне Immediate, и со временем они просто накапливаются. каковы последствия этих исключений, поскольку они, похоже, не влияют на работу системы.

Вот две мои попытки, обе кажутся неуклюжими, и я знаю, что должен быть способ лучше, чем использование VB.IsDBNull и Integer.TryParse ... Или я просто анальный.

(в целое число от объекта)

    Dim nInteger As Integer = 0
    If oData Is Nothing OrElse VB.IsDBNull(oData) Then
    Else
        If bThrowErrorIfInvalid Then
        Else
            On Error Resume Next
        End If
        nInteger = CType(oData, Integer)
    End If
    Return nInteger

(в целое число из строки)

    Dim nInteger As Integer = 0
    If sText Is Nothing Then
    Else
        If bThrowErrorIfInvalid Then
        Else
            On Error Resume Next
        End If
        Integer.TryParse(sText, nInteger) 
    End If
    Return nInteger

Ответов (6)

Решение

Что плохого в использовании Integer.TryParse? Вот для чего это было сделано ...

int i = 0;
string toTest = "not number";
if(int.TryParse(toTest, out i))
{
   // it worked

}

Как это неуклюже? (C# не VB, я знаю, но такая же разница)

РЕДАКТИРОВАТЬ: добавлено, если вы также хотите проверить объект (поскольку TryParse полагается на строку), и я не слишком уверен в том, как вы на самом деле планируете его использовать. Это немного покрывает ваши опасения, поскольку этот метод проверит оба ваших случая?

    static bool TryParseInt(object o, out int i)
    {
        i = 0;

        if (o.GetType() == typeof(int))
        {
            i = (int)o;
            return true;
        }
        else if (o.GetType() == typeof(string))
        {
            return int.TryParse(o as string, out i);
        }

        return false;
    }

Вы можете попробовать это:

Dim i as Integer
Try
    i = Convert.ToInt32(obj)
Catch
    ' This ain't an int
End Try

Convert находится в System пространстве имен.

РЕДАКТИРОВАТЬ: Примечание: если вы собираетесь поместить любой другой код в Try блок, обязательно укажите, что единственное исключение, которое Catch следует перехватить, - это исключение, созданное в Convert.ToInt32 случае / при сбое - в противном случае вы можете столкнуться с неприятной проблемой, если что-то иначе в этом try / catch не удастся.

Dim d As Double = 2.0
Dim i As Integer = CInt(d)
If d - i = 0 Then
     Debug.WriteLine("is integer")
Else
     Debug.WriteLine("not a integer")
End If

Поскольку это VB, вы также можете использовать функцию IsNumeric

похоже, что во втором примере у вас есть ненужная проверка на bThrowErrorIfInvalid, потому что Integer.TryParse никогда не выдает ошибку. Что-то вроде

If bThrowErrorIfInvalid And Not Integer.TryParse(sText, nInteger) Then
   Throw New ArgumentException()
EndIf

Integer.TryParse разработан как безопасный способ сделать это: именно поэтому он изначально был помещен во фреймворк. Для объекта вы всегда можете просто позвонить ToString() перед использованием TryParse .

Я бы также избегал использования On Error Resume Next в пользу Try-Catch блока, если вам по какой-то причине нужно проглотить ошибку, поскольку она гораздо менее вероятно вызовет нежелательный побочный эффект.