Разница между 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