Як я можу подати участь у VB.NET?


151

Чи всі вони рівні? За яких обставин слід обирати кожного з інших?

  • var.ToString ()

  • CStr (var)

  • CType (var, String)

  • DirectCast (var, String)


EDIT: Пропозиція від NotMyself …

  • TryCast (var, String)

Відповіді:


156

Всі вони дещо різні, і, як правило, мають прийнятне використання.

  • var.ToString()збирається подати вам рядкове представлення об'єкта, незалежно від того, який він тип. Використовуйте це, якщо varце вже не рядок.
  • CStr(var)є оператором лиття рядків VB. Я не хлопець ВБ, тому я б запропонував уникати цього, але насправді нічого не зашкодить. Я думаю, що це в основному те саме, що CType.
  • CType(var, String) перетворить заданий тип у рядок, використовуючи будь-які надані оператори перетворення.
  • DirectCast(var, String)використовується для передачі об'єкта в рядок. Якщо ви знаєте, що змінна об'єкта - це насправді рядок, використовуйте це. Це те саме, що і (string)varв C #.
  • TryCast(як згадував @ NotMyself ) схоже DirectCast, але воно повернеться, Nothingякщо змінну не вдасться перетворити на рядок, а не кидати виняток. Це те саме, що і var as stringв C #. TryCastСторінка на MSDN має гарне порівняння, теж.

15
Ніколи немає причин використовувати CType (var, String) замість CStr (var), вони роблять точно те саме.
— Джонатан Аллен

2
@Maslow TryCastпрацює лише для типів значень, оскільки це повинен бути тип, який може мати Nothingзначення
— bdukes

1
@Martinho цілком прав. Це повинно сказати "працює лише для еталонного типу"
— bdukes

3
CStr(var)задушиться і піднять виняток, якщо var DBNull.Value, але альтернативний Convert.ToString(var)поверне порожній рядок.
— MCattle

Dim myList AS ArrayList=new ArrayListКоли ви пишете, (From e In myList select CType(e.Name,String)).ToArray()це не працює. Я прийшов писати ... select CType(e.Name.ToString,String)).ToArray()і повернув усмішку.
— Беллаш

13

Cstr() складається для того, щоб покращити продуктивність.

CType дозволяє проводити касти між типами, якщо визначений оператор перетворення

ToString() Між базовим типом і рядком викидає виняток, якщо перетворення неможливе.

TryParse()З String в базу typeifможливо, інакше повертається false

DirectCastвикористовується, якщо типи пов'язані через успадкування або мають спільний інтерфейс, викине виняток, якщо передача неможлива, trycastв цьому випадку нічого не поверне


8

MSDN, схоже, вказує на те, що кадри Cxxx для конкретних типів можуть підвищити продуктивність у VB .NET, оскільки вони перетворюються на вбудований код. Чомусь він також пропонує DirectCast на відміну від CType у певних випадках (у документації зазначено, що коли є спадкові відносини; я вважаю, що це означає, що розумність акторів перевіряється під час компіляції та можуть застосовуватися оптимізації, тоді як CType завжди використовує Виконання VB.)

Коли я пишу код VB .NET, те, що я використовую, залежить від того, що я роблю. Якщо це прообразний код, який я збираюся викинути, я використовую все, що мені трапляється набирати. Якщо це серйозний код, я намагаюся використовувати амплуа Cxxx. Якщо такої не існує, я використовую DirectCast, якщо я обґрунтовано вважаю, що є спадкові відносини. Якщо це ситуація, коли я не маю уявлення, чи повинен успішний виступ (введення користувача -> цілі числа, наприклад), я використовую TryCast для того, щоб зробити щось більш дружнє, ніж кинути виняток у користувача.

Одне, що я не можу похитнути - це я схильний використовувати ToString замість CStr, але нібито Cstr є швидшим.


8

Я віддаю перевагу наступному синтаксису:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

Так, ви можете сказати, що я зазвичай пишу код на C #. 8)

Причиною, що я вважаю за краще TryCast, є те, що вам не доведеться возитися із накладними винятками кастингу. Ваш виступ або успішний, або ваша змінна ініціалізована до нуля, і ви відповідно вирішите це.


2
Я думаю, ти помилявся. взагалі не дуже корисно використовувати TryCast. у такому випадку, як ваш, слід використовувати номер.ToString () або CStr (число).
— Шиммі Вайцхандлер

4
@Shimmy: У чому причина взагалі не використовувати TryCast? Чи не краще, щоб DirectCast уникав винятку в певних сценаріях?
— Дінекес

3
@Dienekes і NotMyself. TryCast призначений лише для типів ДОВІДКИ. Тут у нас є цілий чисельність, який є типовим значенням. Компілятор відхилить TryCast. Також мета - Рядок. Будь-яка організація .Net, крім нічого, не підтримує .ToString(). Тип значення, такий як Integer, не може бути Нічим. Тож у цьому випадку або CStr (число), або число.ToString () є безпечним. У загальному випадку (не лише типи значень), CStr (що завгодно) є безпечним, тому що він може обробляти Ніщо - результатом буде зміна String нічого. TryCast дуже корисний - тільки не тут.
— ToolmakerSteve

4

-1 тому, що DirectCast тут очевидно НЕ підходить, за винятком дуже обмеженої ситуації, про яку ви не намагалися згадати. DirectCast добре, коли ви знаєте, що у вас є два ПОВ'ЯЗАНІ РЕФЕРЕНТНІ ТИПИ та хочете ефективного кастингу між ними. Оскільки питання стосується отримання програми String, навряд чи ОП обговорювало ситуацію, коли DirectCast доречний.
— ToolmakerSteve

... Якби це питання не було зазначено Stringі ToStringмоя скарга не застосовуватиметься. Ви не повинні виступати за DirectCast, поки ви не звузили тему із загальної КОНВЕРСІЇ.
— ToolmakerSteve

1

Відповідно до іспиту на сертифікацію, ви повинні використовувати Convert.ToXXX (), коли це можливо, для простих перетворень, оскільки це оптимізує ефективність краще, ніж перетворення CXXX.


1
FYI, За словами Пола Віка в Microsoft, оператори Cxxx були швидшими, ніж функції Convert.Toxxx, принаймні в 2004 році, оскільки Cxxx збирається безпосередньо в IL, а не викликає функцію. Хоча його обгрунтування здається сумнівним, враховуючи можливість JIT-оптимізувати виклики функцій. panopticoncentral.net/2004/05/31/the-native-net-language
— ToolmakerSteve

0

Свого часу я пам’ятаю, як бачив стан бібліотеки MSDN для використання CStr (), оскільки це було швидше. Я не знаю, чи це правда.


2
DirectCast швидше, ніж CStr, але ви можете використовувати його лише під час передавання об'єкта рядка в змінну рядка. Він не вдасться, якщо ви спробуєте перетворити будь-який інший об'єкт у рядок.
— Джонатан Аллен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.