Разница между DirectCast () и CType () в VB.NET - PullRequest
96 голосов
/ 16 июня 2010

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

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

Ответы [ 3 ]

178 голосов
/ 16 июня 2010

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

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

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

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

Обычно вы предпочитаете DirectCast(), когда можете.

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

10 голосов
/ 05 июля 2011

С помощью CType вы можете написать что-то вроде этого Ctype("string",Integer). Но с DirectCast вышеприведенное утверждение даст ошибку времени компиляции.

 Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile
0 голосов
/ 11 сентября 2016

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
...