Приведение типов данных с помощью DirectCast, CType, TryCast - PullRequest
40 голосов
/ 24 апреля 2010

С тех пор как я перешел с VB6 на VB.NET где-то в 2005 году, я использую CType для приведения из одного типа данных в другой. Я делаю это, потому что это просто быстрее печатать, раньше существовало в VB6, и я не знаю, почему я должен использовать DirectCast, если между ними, очевидно, нет различий.

Я использую TryCast время от времени, потому что я понимаю, что иногда приведение может завершиться неудачей. Однако я не могу понять разницу между CType и DirectCast.

Может кто-нибудь сказать мне разницу в простом простом английском, в чем разница (CType и DirectCast)? Добавление примеров того, где использовать то, что также было бы полезно.

Ответы [ 4 ]

53 голосов
/ 24 апреля 2010

TryCast и DirectCast - операторы приведения, которые напрямую сопоставляются с поддержкой приведения в CLR. Они могут быстро привести объект базового типа к производному типу или распаковать значение типа значения. DirectCast выдает исключение, когда приведение невозможно, TryCast ничего не возвращает, если произошел сбой. Обычно вы предпочитаете DirectCast для выявления ошибок программирования.

CType допускает расширенный набор преобразований, которые вызывает недовольство CLR. Лучший пример, который я могу придумать, - преобразование строки в число или дату. Например:

Dim obj As Object
obj = "4/1/2010"
Dim dt As DateTime = CType(obj, DateTime)

Что вы должны будете использовать, если действует Option Strict On. Если он выключен, вы можете сделать это напрямую:

Option Strict Off
...
    Dim dt As DateTime = obj

Очень удобно, конечно, и является частью наследия VB.NET как языка с динамической типизацией. Но не без проблем, эта дата - день единорога на stackoverflow.com, но это будет день января, когда британец введет строку. Неожиданные преобразования являются причиной, по которой CLR не разрешает это напрямую. Явное, не удивительное преобразование выглядит так:

Dim dt As DateTime = DateTime.Parse(obj.ToString(), _
    System.Globalization.CultureInfo.GetCultureInfo("en-US").DateTimeFormat)

Стоит ли покупать в Try / DirectCast против CType против явных преобразований - это скорее личный выбор. Если вы сейчас программируете с Option Strict On, вам определенно следует начать использовать Try / DirectCast. Если вы предпочитаете язык VB.NET, потому что вам нравится удобство динамической типизации, не стесняйтесь оставаться на CType.

16 голосов
/ 24 апреля 2010

DirectCast в два раза быстрее для типов значений (целые числа ... и т. Д.), Но идентичен для ссылочных типов.

Для получения дополнительной информации см. Раздел «Функции преобразования, CType, DirectCast и System.Convert» на этой странице MSDN.

1 голос
/ 24 апреля 2010

Эта страница объясняет это хорошо.

Читая это, я думаю, что когда вы используете DirectCast, вы уверены, что преобразование будет работать без сужения или расширения (в данном случае, числовых данных). Принимая во внимание, что CType будет пытаться конвертировать в него, при этом разработчик осознает сужение / расширение.

0 голосов
/ 28 сентября 2012

Под «преобразованием» подразумевается преобразование одного типа данных в другой (например, строка в целое число, десятичное в целое число, объект в строку и т. д.).

Под «приведением» подразумевается изменение одного типа объекта на другой тип, который связан с этим одним из следующих правил.

http://www.thedevheaven.com/2012/09/directcast-vs-ctype.html

...