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


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

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

3 87

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# ' s 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

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

это, однако, не выдает ошибку:

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