Разница между DirectCast () и CType () в VB.NET
Я опытный программист C / C++ / C#, который только что вошел VB.NET. я обычно использую CType (и CInt, CBool, CStr) для приведений, потому что это меньше символов и был первым способом литья, которому я подвергался, но я также знаю о DirectCast и TryCast.
просто, есть ли какие-либо различия (эффект броска, производительность и т. д.) между DirectCast и CType? Я понимаю идею TryCast.
3 ответа:
первое, что нужно отметить, это то, что VB.NET не имеет прямого аналога C# ' s
(type)instance
механизм литья. Я поднимаю это, потому что полезно использовать это в качестве отправной точки при сравнении двух VB.NET операторы (и это операторы, а не функции, хотя они имеют семантику функций).
DirectCast()
является более строгим, чем оператор приведения C#. Он позволяет только бросать, когда элемент бросается уже тип, который вы бросаете. Это не выполнять какие-либо преобразования. Так, например, вы не можете бросить от short до int, как вы могли бы с C#(int)
литой. Но вы можете привести от IEnumerable к массиву, если ваш базовыйIEnumerable
объектная переменная действительно являетсяArray
. И, конечно, вы можете привести от объекта к чему угодно, предполагая, что тип вашего экземпляра объекта действительно находится где-то ниже вашего типа приведения в дереве наследования.это желательно, потому что это делает его быстрее. Там немного меньше преобразование и проверка типов, которые должны иметь место.
CType()
является менее строгим, чем оператор кастинга C#. Он будет делать такие вещи, как преобразование строки в целое число, которое вы не можете просто сделать с помощью простого(int)
литой. Он обладает такой же силой, как и призывConvert.To___()
в C#, где _ _ _ является целевым типом вашего приведения. Это желательно, потому что это очень мощный, но эта сила приходит за счет производительности - это не так быстро, как оператор directcast() или C#, потому что там может быть довольно много работы, чтобы закончить бросок.как правило, вы должны предпочесть
DirectCast()
когда вы можете.наконец, вы пропустили одного оператора кастинга:
TryCast()
, который является прямым аналогом C# ' sas
оператора.
С
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
Он также будет показан в среде IDE Visual Studio.
это, однако, не выдает ошибку:
Sub Main() Dim newint As Integer = CType(3345.34, Integer) Console.WriteLine(newint) Console.ReadLine() End Sub