Разница между DirectCast () и CType () в VB.NET

Я опытный программист C / C ++ / C #, который только что попал в VB.NET. Обычно я использую CType (и CInt, CBool, CStr) для трансляции, потому что он меньше символов и был первым способом кастинга, которым я подвергался, но я также знаю DirectCast и TryCast.

Просто существуют ли различия между эффектом литья, производительности и т. Д. Между DirectCast и CType? Я понимаю идею TryCast.

Первое, что нужно отметить, это то, что VB.NET не имеет прямого аналога с механизмом литья (type)instance C # (type)instance . Я приношу это, потому что полезно использовать это в качестве отправной точки для сравнения двух операторов VB.NET (и они являются операторами, а не функциями, хотя у них есть семантика функций).

DirectCast() более строг, чем оператор литья C #. Это позволяет вам делать только тогда, когда уже выбранный элемент это тип, на который вы производите. Он не будет конвертировать. Так, например, вы не можете использовать от short до int, как вы могли бы с помощью C # (int) . Но вы можете отбрасывать из IEnumerable в массив, если ваша основная переменная объекта IEnumerable действительно является Array . И, конечно, вы можете отбрасывать из Object на что угодно, предполагая, что тип вашего экземпляра объекта действительно находится ниже вашего типа броска в дереве наследования.

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

CType() менее строг, чем оператор литья C #. Он будет делать такие вещи, как преобразование строки в целое число, которое вы не можете просто сделать с простым (int) литьем. Он обладает такой же мощью, как вызов Convert.To___() в C #, где ___ является целевым типом вашего броска. Это желательно, потому что оно очень мощное, но эта мощность стоит за счет производительности – это не так быстро, как DirectCast () или оператор C #, потому что для завершения трансляции может быть довольно много работы.

Как правило, вы должны предпочесть DirectCast() когда сможете.

Наконец, вы пропустили один оператор кастинга: TryCast() , который является прямым аналогом оператора C #.

С помощью CType вы можете написать что-то вроде этого Ctype("string",Integer) . Но с DirectCast приведенный выше оператор даст ошибку времени компиляции.

  Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error Dim b As Integer = CType("1", Integer) 'Will compile 

DirectCast более ограничительный, чем CType .

Например, это вызовет ошибку:

 Sub Main() Dim newint As Integer = DirectCast(3345.34, Integer) Console.WriteLine(newint) Console.ReadLine() End Sub 

Он также будет показан в среде Visual Studio IDE.

Однако это не вызывает ошибки:

 Sub Main() Dim newint As Integer = CType(3345.34, Integer) Console.WriteLine(newint) Console.ReadLine() End Sub 
  • Выбор того IP-адреса, который используется HTTP-запросом при наличии нескольких IP-адресов (.NET)
  • Установить на тот же путь при обновлении приложения
  • Что такое .axd-файл?
  • Выполнение математики в vb.net как Eval в javascript
  • Причина этого VB6-подобного запаха, который позволяет VB.NET, вместо этого: Ошибка WinFormType.InstanceProp = Значение
  • Как получить размер удобочитаемого файла в аббревиатуре байтов с помощью .NET?
  • Разница с параметрами.Add и Parameters.AddWithValue
  • Зачем использовать String.Format?
  • Что обычно лучше всего использовать - StringComparison.OrdinalIgnoreCase или StringComparison.InvariantCultureIgnoreCase?
  • VB.NET 'With' Statement - обнимать или избегать?
  • Как поместить данные, содержащие двойные кавычки в строковой переменной?
  • Interesting Posts

    Linux – альтернативные места для хранения файла pid вместо / var / run

    Сортировка с использованием Comparator-Descending order (Пользовательские classы)

    Загрузочные окна, установленные с UEFI, только для хоста

    Недорогое, простое приложение для записи экрана для Mac

    Вычисление перестановок в F #

    Плохие сектора на жестком диске

    Использование акселерометра, гироскопа и компаса для расчета движения устройства в 3D-мире

    Непризнанное сообщение SSL, соединение с открытым текстом? исключение

    Что такое блокировка уровня classа в java

    Показать контекстное меню при нажатии мыши

    Как использовать Buffered Reader в Java

    Насколько большой может получить firebase database MySQL до того, как производительность начнет ухудшаться

    необходимо вызвать функцию с периодическими временными интервалами в c ++

    Как использовать инструкции if в LESS

    Как предотвратить по умолчанию Windows 7 с помощью VPN-шлюза?

    Давайте будем гением компьютера.