2015-08-09 3 views
1
Dim Num As Integer = Console.ReadLine 

Если строка выше Console.ReadLine возвращает String, а Num - целое, то какова важность для явного преобразования? Почему бы не каждый раз принимать значение в желаемом DataType, а затем сохранять спокойствие?Зачем нам нужно Явное преобразование

+5

Пользователь может тривиально разрушить вашу программу, введя свое имя вместо номера. Вы можете обвинить пользователя или можете обвинить себя в том, что вы не используете Integer.TryParse(). Это тебе решать. –

+3

Если у вас есть опция Strict On, вы обнаружите проблему в своей программе, когда пытаетесь ее скомпилировать, без нее ваш пользователь обнаружит проблему в вашей программе при вводе строки, которая не может быть «автоматически» преобразована в число. Это зависит от того, хотите ли вы быть профессионалом или нет. – Steve

+0

@HansPassant, и почему я должен использовать цикл do в vb.net, чтобы пользователь не мог зацикнуться в бесконечном цикле, может быть, в случае написания моего имени? – Anas

ответ

3

Представьте, что вы ищете ошибку в программе, которая имеет

  • тысяч строк кода
  • 10 авторы проекта, 5 из них не более доступных
  • сотни автоматических переходов между строками и числами

С этими автоматическими преобразованиями вы получаете ненужное пространство для ошибок. С другой стороны, отвергая автоматические преобразования вы вынуждаете программисты думают на каждом месте, где они помещают их:

  • Мне нужно преобразование. Зачем? Действительно ли я использую наиболее подходящие типы данных для этой задачи?
  • Может ли вход содержать символы, которые приведут к отказу преобразования?
  • Что делать, если ввод пустой, пустой или содержит только пробелы?
  • Что делать, если вход имеет правильные символы, но слишком длинный?
  • Что делать, если вход превышает допустимый диапазон для типа назначения?
  • Если компьютер клиента переключается на языковой стандарт, который использует специальные цифровые символы (не 0-9, а арабские или тамильские цифры), будет ли преобразование работать?
  • Должен ли я использовать инвариантный формат в данном месте или национальном, затронутый выбранной локалью?
  • Где поток программы будет продолжаться, если здесь происходит сбой преобразования? (Например, если есть исключение.)

Вы можете видеть, сколько вещей вы можете пренебречь, выполняя автоматические преобразования и сколько ошибок может возникнуть из-за этого?

Даже отладка кода с явными преобразованиями выполняется быстрее, потому что после автоматического преобразования вы можете подумать: было ли сделано правильно? Поэтому вы можете почувствовать, что вам всегда нужно проверять еще одну вещь. Поскольку автоматическое преобразование является намного более черным ящиком, чем явное преобразование. Кто может помнить все свое поведение?

Учитывая аспекты каждого преобразования (как показано в вышеприведенных вопросах) и реализации взвешенных решений (хотя и через явные обозначения), резко улучшается качество исходного кода. Это важный фактор в крупных приложениях.

Так VB профессионалы используют по крайней мере, эти два варианта:

Option Explicit On 
Option Strict On 

а также обычно

Option Infer Off 

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

2

Это не обязательно, если вы знаете, что отправляемое значение является целым числом, но если вы не знаете, что он действительно ввел, полезно создать CType для создания преобразования типа. Пример:

'OK 
Dim x As Int32 = "1246" 
'Error 
Dim y As Int32 = "ABC" 

Автоматически, то Visual Basic синтаксического анализа преобразует значения одного типа к другому типу (т.е. из Option Strict Off)

Dim A As Int32 = "3587" 'String type => Integer 

' Automatically, the Parser will do this: 
Dim B As Int32 = CType("3587".ToString, Int32) 

Это сделано в каждой структуре или класса, все из которых имеют CType узкий и широкий, который преобразует тип структур, например:

Public Shared Widening Operator CType(ByVal a As String, ByVal b As Int32) As Int32 
    Dim TMP% = a.ToString 'Cast 
    Return CInt(TMP) 
End Operator 

Существует булева функция, которая возвращает истину, если строка является производными е рум целое и могут быть преобразованы, это сделает ваш код и освободит многие Try...End Try:

Try 
    Dim n As Int32 = "abc" 
Catch ex As Exception 
    MsgBox("Invalid cast") 
End Try 

'replace with: 

Dim yourInput$ = "AbcDef447" 
Dim _yourInput$ = "3867" 
Dim myNum As Int32? = 0 

If IsNumeric(yourInput) Then 
    Console.WriteLine("yourInput can be an integer.") 
    myNum = yourInput 
ElseIf IsNumeric(_yourInput) Then 
    Console.WriteLine("_yourInput can be an integer.") 
    myNum = _yourInput 
Else 
    Console.WriteLine("No one can be an integer.") 
    GC.SupreessFinalize(myNum) 
End If 

'Output: 
'_yourInput can be an integer. 
'then finally: myNum is 3867. 

Во всяком случае, это всегда хорошо использовать методы, которые можно проверить, может ли быть преобразован тип, попробуйте с помощью метода TryParse (доступны во всех типах, например Int32.TryParse) или с операторами CType.

Смежные вопросы