Претварање и претворба типа података у ВБ.НЕТ

click fraud protection

Цастинг је онај процес претварања једног типа података у други, на пример, из типа Интегер у Стринг тип. Неке операције у ВБ.НЕТ захтијевају да раде одређене врсте података. Цастинг ствара тип који вам је потребан. Први чланак у овој дводелној серији „Цастинг“ и „Дата Цонверверс Типе“ у ВБ.НЕТ-у уводи кастинг. Овај чланак описује три оператора на која можете да играте улогу ВБ.НЕТ - ДирецтЦаст, ЦТипе и ТриЦаст - и упоређује њихове перформансе.

Перформансе су једна од великих разлика између три оператора кастинга према Мицрософту и другим чланцима. На пример, Мицрософт обично пажљиво упозорава на то да је „ДирецтЦаст... може пружити нешто боље перформансе од ЦТипе-а при претварању у и из типа података Објект. "(Нагласак је додан.)

Одлучио сам написати неку шифру да проверим.

Али прво реч опреза. Дан Апплеман, један од оснивача издавача техничке књиге Апресс и поуздан техничар гуру, једном ми је рекао да је перформансе бенчмаркинга много теже правилно направити од већине људи схвати. Постоје фактори попут перформанси машине, других процеса који се могу одвијати паралелно, оптимизација попут кеширања меморије или оптимизације компајлера и грешака у вашим претпоставкама о томе шта је заправо код ради. У овим референтним вредностима покушао сам да елиминишем грешке упоређивања „јабука и наранџе“ и сви тестови су покренути са изградњом издања. Али и даље може бити грешака у овим резултатима. Ако приметите било шта, молим вас да ме обавестите.

instagram viewer

Три оператора кастинга су:

  • ДирецтЦаст
  • ЦТипе
  • ТриЦаст

У пракси, обично ћете установити да ће захтеви ваше апликације одредити оператера који користите. ДирецтЦаст и ТриЦаст имају веома уске захтеве. Када користите ДирецтЦаст, тип се мора већ знати. Иако је код ...

тхеСтринг = ДирецтЦаст (тхеОбјецт, стринг)

... ће се успешно саставити ако тхеОбјецт већ није низ, тада ће код изузети рунтиме изузетак.

ТриЦаст је још рестриктивнији јер неће уопште радити на "вредност" врстама као што је Интегер. (Стринг је референтни тип. Више о типовима вредности и референтним типовима потражите у првом чланку у овој серији.) Овај код ...

тхеИнтегер = ТриЦаст (тхеОбјецт, Интегер)

... неће компајлирати.

ТриЦаст је користан када нисте сигурни са којом врстом објекта радите. Уместо да баци грешку као што је ДирецтЦаст, ТриЦаст само враћа ништа. Уобичајена пракса је тестирати ништа након извршења ТриЦаст-а.

Само ЦТипе (и остали оператери „Претвори“ као што су ЦИнт и ЦБоол) ће претворити типове који немају наследни однос, као што је Интегер у Стринг:

ЗатамниСтринг као стринг = "1" Затамните Интегер као Интегер. тхеИнтегер = ЦТипе (тхеСтринг, Интегер)

Ово функционише зато што ЦТипе користи „помоћне функције“ које нису део .НЕТ ЦЛР (Цоммон Лангуаге Рунтиме) за извршавање ових конверзија.

Али запамтите да ће ЦТипе такође избацити изузетак акоСтринг не садржи нешто што се може претворити у Интегер. Ако постоји могућност да низ није цео број као овај ...


ЗатамниСтринг као стринг = "Георге"

... тада ниједан оператер кастинга неће радити. Чак ни ТриЦаст неће радити с Интегер-ом јер је тип вредности. У случају попут овог, морали бисте користити провере ваљаности, као што је оператор ТипеОф, да бисте проверили своје податке пре него што их покушате да емитујете.

Мицрософтова документација за ДирецтЦаст посебно помиње кастинг с типом Објецт, тако да сам то користио у свом првом тесту перформанси. Тестирање почиње на следећој страници!

ДирецтЦаст ће обично користити тип Објекта, тако да сам то користио у свом првом тесту перформанси. Да бих у тест укључио ТриЦаст, укључио сам и блок Иф јер ће га имати скоро сви програми који користе ТриЦаст. У овом случају, међутим, никада неће бити извршен.

Ево кода који упоређује све три приликом бацања објекта на низ:

Затамните време као нови штоперица () Затамните стринг као низ. Затамни објект као објект = "објект" Затамните интеракције као Интегер = ЦИнт (Итерације. Текст) * 1000000. ' 'ДирецтЦаст тест. време. Почетак() За и = 0 На Итерације. тхеСтринг = ДирецтЦаст (тхеОбјецт, стринг) Следећи. време. Зауставити() ДирецтЦастТиме. Текст = време. ЕлапседМиллисецондс. ТоСтринг. ' 'ЦТипе тест. време. Поново покренути() За и као Интегер = 0 на Итерације. тхеСтринг = ЦТипе (тхеОбјецт, Стринг) Следећи. време. Зауставити() ЦТипеТиме. Текст = време. ЕлапседМиллисецондс. ТоСтринг. ' 'ТриЦаст тест. време. Поново покренути() За и као Интегер = 0 на Итерације. тхеСтринг = ТриЦаст (тхеОбјецт, стринг) Ако стринг није ништа. МсгБок ("Ово се никада не би требало приказивати") Енд Иф. Следећи. време. Зауставити() ТриЦастТиме. Текст = време. ЕлапседМиллисецондс. ТоСтринг.

Чини се да овај почетни тест показује да је Мицрософт тачно у мети. Ево резултата. (Експерименти са већим и мањим бројем понављања, као и поновљени тестови под различитим условима нису показали значајне разлике од овог резултата.)


Кликните овде да прикажете илустрацију

ДирецтЦаст и ТриЦаст били су слични у 323 и 356 милисекунди, али ЦТипе је преузео три пута више времена у 1018 милисекунди. Када бацате овако референтне типове, плаћате флексибилност ЦТипе-а у перформансама.

Али, да ли увек успева на овај начин? Пример Мицрософта на њиховој страници за ДирецтЦаст углавном је користан када вам кажем шта неће радити користећи ДирецтЦаст, а не шта ће. Ево Мицрософтовог примера:

Дим к као објект = 2,37. Дим и Ас Интегер = ЦТипе (к, цео број) 'Следећа конверзија не успева у време рада. Дим ј као Интегер = ДирецтЦаст (к, цео број) Дим ф као нови систем. Виндовс. Обрасци. Образац. Дим ц као систем. Виндовс. Обрасци. Контрола. „Следећа конверзија је успела. ц = ДирецтЦаст (ф, систем. Виндовс. Обрасци. Контрола)

Другим речима, ви не могу користите ДирецтЦаст (или ТриЦаст, мада га овде не спомињу) да бисте додали тип Објекта типу Интегер, али ви моћи користите ДирецтЦаст да бисте додали тип обрасца у тип контроле.

Проверимо перформансе Мицрософтовог примера онога ће рад са ДирецтЦаст-ом. Употребом истог предлошка кода приказаног горе, замените ...


ц = ДирецтЦаст (ф, систем. Виндовс. Обрасци. Контрола)

... у код заједно са сличним замјенама за ЦТипе и ТриЦаст. Резултати су помало изненађујући.


Кликните овде да прикажете илустрацију

ДирецтЦаст је заправо био најспорији од три избора у 145 милисекунди. ЦТипе је само нешто бржи у 127 милисекунди, али ТриЦаст, укључујући блок Иф, најбржи је за 77 милисекунди. Такође сам покушао да напишем своје предмете:


Класа ПарентЦласс... Енд Цласс. Класа ЦхилдЦласс. Наследи ПарентЦласс... Енд Цласс. 

Имам сличне резултате. Изгледа да ако јесте не бацање врсте објекта, боље вам је не користећи ДирецтЦаст.

instagram story viewer