Приведение и преобразование типов данных в VB.NET

Кастинг это процесс преобразования одного типа данных в другой, например, из типа Integer в тип String. Некоторые операции в VB.NET требуют определенных типов данных для работы. Кастинг создает нужный вам тип. Первая статья в этой серии из двух частей - «Приведение типов и преобразование типов данных в VB.NET» - посвящена приведению типов. В этой статье описываются три оператора, которые вы можете использовать для приведения VB.NET - DirectCast, CType и TryCast - и сравнивает их производительность.

Производительность - одно из больших различий между тремя операторами приведения в соответствии с Microsoft и другими статьями. Например, Microsoft обычно осторожно предупреждает, что «DirectCast... может обеспечить несколько лучшую производительность, чем CType при преобразовании в и из типа данных Object. "(Выделение добавлено.)

Я решил написать код для проверки.

Но сначала слово предостережения. Дэн Эпплман, один из основателей издательства технической книги Apress и надежный технический Гуру, однажды сказал мне, что тестирование производительности гораздо сложнее сделать правильно, чем большинство людей понимать. Существуют такие факторы, как производительность машины, другие процессы, которые могут выполняться параллельно, оптимизация как кеширование памяти или оптимизация компилятора, и ошибки в ваших предположениях о том, что на самом деле код делает. В этих тестах я попытался устранить ошибки сравнения «яблок и апельсинов», и все тесты были запущены в сборке релиза. Но все еще могут быть ошибки в этих результатах. Если вы заметили, пожалуйста, дайте мне знать.

instagram viewer

Три оператора приведения:

  • DirectCast
  • CType
  • TryCast

На практике вы обычно обнаружите, что требования вашего приложения будут определять, каким оператором вы пользуетесь. DirectCast и TryCast имеют очень узкие требования. Когда вы используете DirectCast, тип уже должен быть известен. Хотя код ...

theString = DirectCast (theObject, String)

... успешно скомпилируется, если theObject не является строкой, тогда код выдаст исключение времени выполнения.

TryCast еще более ограничен, потому что он не будет работать вообще на типах «value», таких как Integer. (Строка является ссылочным типом. Подробнее о типах значений и ссылочных типах см. В первой статье этой серии.) Этот код ...

theInteger = TryCast (theObject, Integer)

... даже не скомпилирует.

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

Только CType (и другие операторы «Преобразовать», такие как CInt и CBool) будут преобразовывать типы, которые не имеют отношения наследования, такие как Integer, в String:

Dim theString As String = "1" Dim theInteger As Integer. theInteger = CType (theString, Integer)

Это работает, потому что CType использует «вспомогательные функции», которые не являются частью .NET CLR (Common Language Runtime) для выполнения этих преобразований.

Но помните, что CType также выдаст исключение, если строка не содержит чего-то, что может быть преобразовано в целое число. Если есть вероятность, что строка не является целым числом, как это ...


Dim theString As String = "Джордж"

... тогда оператор кастинга не будет работать. Даже TryCast не будет работать с Integer, потому что это тип значения. В таком случае вам придется использовать проверку достоверности, такую ​​как оператор TypeOf, для проверки ваших данных перед попыткой их приведения.

В документации Microsoft для DirectCast конкретно упоминается приведение типов объектов, поэтому я использовал это в своем первом тесте производительности. Тестирование начинается на следующей странице!

DirectCast обычно использует тип Object, поэтому я использовал его в своем первом тесте производительности. Чтобы включить TryCast в тест, я также включил блок If, так как почти во всех программах, использующих TryCast, будет такой. В этом случае, однако, он никогда не будет выполнен.

Вот код, который сравнивает все три при приведении объекта к строке:

Dim theTime, как новый секундомер () Dim theString As String. Dim theObject As Object = "Объект" Dim theIterations As Integer = CInt (Итерации. Текст) * 1000000. ' Тест DirectCast. время. Начало() Для i = 0 Для участников. theString = DirectCast (theObject, String) Следующий. время. Стоп() DirectCastTime. Текст = время. ElapsedMilliseconds. Нанизывать. ' 'CType Test. время. Начать сначала() Ибо я как целое число = 0 в конце. theString = CType (theObject, String) Следующий. время. Стоп() CTypeTime. Текст = время. ElapsedMilliseconds. Нанизывать. ' 'Попробуй Тест. время. Начать сначала() Ибо я как целое число = 0 в конце. theString = TryCast (theObject, String) Если строка ничего не значит MsgBox («Это никогда не должно отображаться») Конец если. Следующий. время. Стоп() TryCastTime. Текст = время. ElapsedMilliseconds. Нанизывать.

Этот первоначальный тест, похоже, показывает, что Microsoft находится на верном пути. Вот результат. (Эксперименты с большим и меньшим числом итераций, а также повторные тесты в разных условиях не показали существенных отличий от этого результата.)


Нажмите здесь, чтобы отобразить иллюстрацию

DirectCast и TryCast были похожи на 323 и 356 миллисекунд, но CType занимал в три раза больше времени на 1018 миллисекунд. При приведении ссылочных типов, подобных этому, вы платите за гибкость CType в производительности.

Но всегда ли так работает? Пример Microsoft на их странице для DirectCast в основном полезен для того, чтобы рассказать вам, что не будет работать с помощью DirectCast, а не то, что будет. Вот пример Microsoft:

Dim q As Object = 2,37. Dim i As Integer = CType (q, Integer) «Следующее преобразование не выполняется во время выполнения. Dim j As Integer = DirectCast (q, Integer) Тусклый как новая система. Окна. Формы. Форма. Dim c As System. Окна. Формы. Контроль. «Следующее преобразование прошло успешно. c = DirectCast (f, система. Окна. Формы. Контроль)

Другими словами, вы не может использовать DirectCast (или TryCast, хотя они здесь не упоминают), чтобы привести тип объекта к типу Integer, но вы мочь используйте DirectCast для приведения типа формы к типу элемента управления.

Давайте проверим производительность Microsoft на примере того, что будет работать с DirectCast. Используя тот же шаблон кода, показанный выше, подставьте ...


c = DirectCast (f, система. Окна. Формы. Контроль)

... в код вместе с аналогичными заменами для CType и TryCast. Результаты немного удивительны.


Нажмите здесь, чтобы отобразить иллюстрацию

DirectCast был на самом деле самым медленным из трех вариантов при 145 миллисекундах. CType немного быстрее за 127 миллисекунд, но TryCast, включая блок If, быстрее всего за 77 миллисекунд. Я также попытался написать свои собственные объекты:


Класс ParentClass... Конечный класс. Класс ChildClass. Наследует ParentClass... Конечный класс. 

Я получил аналогичные результаты. Похоже, что если вы не приведение типа объекта, вам лучше не используя DirectCast.

instagram story viewer