Разница между DirectCast () и CType () в VB.NET
Я опытный программист C / C ++ / C #, который только что попал в VB.NET. Обычно я использую CType (и CInt, CBool, CStr) для трансляции, потому что он меньше символов и был первым способом кастинга, которым я подвергался, но я также знаю DirectCast и TryCast.
Просто существуют ли различия между эффектом литья, производительности и т. Д. Между DirectCast и CType? Я понимаю идею TryCast.
- Самый быстрый способ удаления пустых строк и столбцов из файлов Excel с помощью Interop
- HTTP GET в VB.NET
- OleDbException был необработанным ... Ошибка синтаксиса в инструкции UPDATE
- Есть ли условный тернарный оператор в VB.NET?
- Многострочные строки в VB.NET
- Как преобразовать формат даты в vb.net?
- Ломать / выходить в vb.net
- Автоматическая настройка winform и элементов управления размером экрана
- Формат TimeSpan более 24 часов
- Разница между + и & для присоединения строк в VB.NET
- Как создать контрольные массивы в VB .NET
- Как сгладить вложенные объекты с выражением linq
- Разница в производительности между IIf () и If
Первое, что нужно отметить, это то, что 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