Як я можу подати участь у 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.