Чи всі вони рівні? За яких обставин слід обирати кожного з інших?
var.ToString ()
CStr (var)
CType (var, String)
DirectCast (var, String)
EDIT: Пропозиція від NotMyself …
- TryCast (var, String)
Чи всі вони рівні? За яких обставин слід обирати кожного з інших?
var.ToString ()
CStr (var)
CType (var, String)
DirectCast (var, String)
EDIT: Пропозиція від NotMyself …
Відповіді:
Всі вони дещо різні, і, як правило, мають прийнятне використання.
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 має гарне порівняння, теж.TryCast
працює лише для типів значень, оскільки це повинен бути тип, який може мати Nothing
значення
CStr(var)
задушиться і піднять виняток, якщо var DBNull.Value, але альтернативний Convert.ToString(var)
поверне порожній рядок.
Dim myList AS ArrayList=new ArrayList
Коли ви пишете, (From e In myList select CType(e.Name,String)).ToArray()
це не працює. Я прийшов писати ... select CType(e.Name.ToString,String)).ToArray()
і повернув усмішку.
Cstr()
складається для того, щоб покращити продуктивність.
CType
дозволяє проводити касти між типами, якщо визначений оператор перетворення
ToString()
Між базовим типом і рядком викидає виняток, якщо перетворення неможливе.
TryParse()
З String в базу typeif
можливо, інакше повертається false
DirectCast
використовується, якщо типи пов'язані через успадкування або мають спільний інтерфейс, викине виняток, якщо передача неможлива, trycast
в цьому випадку нічого не поверне
MSDN, схоже, вказує на те, що кадри Cxxx для конкретних типів можуть підвищити продуктивність у VB .NET, оскільки вони перетворюються на вбудований код. Чомусь він також пропонує DirectCast на відміну від CType у певних випадках (у документації зазначено, що коли є спадкові відносини; я вважаю, що це означає, що розумність акторів перевіряється під час компіляції та можуть застосовуватися оптимізації, тоді як CType завжди використовує Виконання VB.)
Коли я пишу код VB .NET, те, що я використовую, залежить від того, що я роблю. Якщо це прообразний код, який я збираюся викинути, я використовую все, що мені трапляється набирати. Якщо це серйозний код, я намагаюся використовувати амплуа Cxxx. Якщо такої не існує, я використовую DirectCast, якщо я обґрунтовано вважаю, що є спадкові відносини. Якщо це ситуація, коли я не маю уявлення, чи повинен успішний виступ (введення користувача -> цілі числа, наприклад), я використовую TryCast для того, щоб зробити щось більш дружнє, ніж кинути виняток у користувача.
Одне, що я не можу похитнути - це я схильний використовувати ToString замість CStr, але нібито Cstr є швидшим.
Я віддаю перевагу наступному синтаксису:
Dim number As Integer = 1
Dim str As String = String.TryCast(number)
If str IsNot Nothing Then
Так, ви можете сказати, що я зазвичай пишу код на C #. 8)
Причиною, що я вважаю за краще TryCast, є те, що вам не доведеться возитися із накладними винятками кастингу. Ваш виступ або успішний, або ваша змінна ініціалізована до нуля, і ви відповідно вирішите це.
.ToString()
. Тип значення, такий як Integer, не може бути Нічим. Тож у цьому випадку або CStr (число), або число.ToString () є безпечним. У загальному випадку (не лише типи значень), CStr (що завгодно) є безпечним, тому що він може обробляти Ніщо - результатом буде зміна String нічого. TryCast дуже корисний - тільки не тут.
Користувач Конрад Рудольф виступає за DirectCast () у питанні переповнення стека "Приховані особливості VB.NET" .
String
, навряд чи ОП обговорювало ситуацію, коли DirectCast доречний.
String
і ToString
моя скарга не застосовуватиметься. Ви не повинні виступати за DirectCast, поки ви не звузили тему із загальної КОНВЕРСІЇ.
Відповідно до іспиту на сертифікацію, ви повинні використовувати Convert.ToXXX (), коли це можливо, для простих перетворень, оскільки це оптимізує ефективність краще, ніж перетворення CXXX.
Свого часу я пам’ятаю, як бачив стан бібліотеки MSDN для використання CStr (), оскільки це було швидше. Я не знаю, чи це правда.