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

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

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

3 ответа

Решение

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

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

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

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

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

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

С 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
Другие вопросы по тегам