2010-06-16 44 views
84

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

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

+6

Точная копия этого * литейные Datatypes с DirectCast, CType, TryCast * http://stackoverflow.com/questions/2703585/casting-datatypes-with-directcast-ctype-trycast – MarkJ

+1

Возможные дубликатом [Casting Datatypes с DirectCast, CType, TryCast] (https: // stackoverflow.com/questions/2703585/casting-datatypes-with-directcast-ctype-trycast) – Imad

ответ

151

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

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

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

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

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

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

+17

+1 Я бы сказал, что строгость DirectCast - еще одно преимущество. Если вы ошиблись, компилятор сразу вам сообщит, но с 'CType' ошибка может привести к случайным неправильным поведением во время выполнения - возможно, на некоторых пользовательских машинах с различными региональными настройками. – MarkJ

+0

Отличный ответ. Итак, в порядке сложности (от малого до большого): 'DirectCast',' TryCast', 'CType' /' Convert.ToXYZ() ',' C () 'будет верным? – motto

+2

@motto - близко. Функции C () должны быть перемещены выше в списке, поскольку они действительно являются операторами, а не функциями, даже если они имеют функциональную семантику. Для тех типов, которые у них есть, они очень близки к кастингу C# (типа), но будут делать немного больше работы. –

10

С 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

DirectCast Множество ограничений, чем CType. Например,

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

выдает ошибку. он также отображается в IDE визуальной студии. Но

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

Не выдает ошибку.

Смежные вопросы