Как я должен кастовать в VB.NET?

151

Все ли они равны? При каких обстоятельствах я должен выбирать друг друга?

  • var.ToString ()

  • CStr (вар)

  • CType (var, String)

  • DirectCast (var, String)


РЕДАКТИРОВАТЬ: Предложение от NotMyself ...

  • TryCast (var, String)
Зак Петерсон
источник

Ответы:

156

Все они немного отличаются и обычно имеют приемлемое использование.

  • var.ToString()собирается дать вам строковое представление объекта, независимо от его типа. Используйте это, если varэто не строка уже.
  • CStr(var)является оператором приведения строки VB Я не VB парень, поэтому я бы посоветовал избегать этого, но это не повредит. Я думаю, что это в основном так же, как CType.
  • CType(var, String) преобразует данный тип в строку, используя любые предоставленные операторы преобразования.
  • DirectCast(var, String)используется для преобразования объекта в строку. Если вы знаете, что переменная объекта является строкой, используйте это. Это так же, как (string)varв C #.
  • TryCast(как упомянуто @ NotMyself ) похоже DirectCast, но он вернется, Nothingесли переменная не может быть преобразована в строку, вместо того, чтобы генерировать исключение. Это так же, как var as stringв C #. TryCastСтраница на MSDN имеет хорошее сравнение, тоже.
bdukes
источник
15
Нет никакой причины использовать CType (var, String) вместо CStr (var), они делают то же самое.
Джонатан Аллен
2
@Maslow TryCastработает только для типов значений, так как это должен быть тип, который может иметь Nothingзначение
bdukes
1
@ Мартиньо совершенно верно. Это должно сказать "работает только для ссылочного типа"
bdukes
3
CStr(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 в base typeifвозможно, иначе возвращает false

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

Сиддхарт Рут
источник
8

Похоже, что MSDN указывает, что приведение Cxxx для определенных типов может повысить производительность в VB .NET, поскольку они преобразуются во встроенный код. По некоторым причинам, он также предлагает DirectCast в отличие от CType в некоторых случаях (в документации говорится, что это когда есть отношение наследования; я считаю, что это означает, что целостность приведения проверяется во время компиляции и может применяться оптимизация, тогда как CType всегда использует VB runtime.)

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

Одна вещь, которую я не могу поколебать, это то, что я склонен использовать ToString вместо CStr, но предположительно Cstr работает быстрее.

OwenP
источник
8

Я предпочитаю следующий синтаксис:

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

If str IsNot Nothing Then

Ха, вы можете сказать, что я обычно пишу код на C #. 8)

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

NotMyself
источник
2
Я думаю, что ты не прав. не стоит использовать TryCast вообще. в случае, подобном вашему, следует использовать number.ToString () или CStr (число).
Шимми Вайцхандлер
4
@Shimmy: В чем причина неиспользования TryCast? Не лучше ли DirectCast избегать исключений в определенных сценариях?
Dienekes
3
@Dienekes и NotMyself. TryCast только для справочных типов. Здесь у нас есть Integer, который является типом VALUE. Компилятор отклонит TryCast. Кроме того, целью является строка. Любой объект .Net, кроме Nothing, поддерживает .ToString(). Тип значения, такой как Integer, не может быть Nothing. Таким образом, в этом случае CStr (число) или число. ToString () является безопасным. В общем случае (не только типы значений) CStr (что угодно) является безопасным, потому что он может ничего не обрабатывать - результатом будет Nothing в переменной String. TryCast очень полезен - только не здесь.
ToolmakerSteve
4

Пользователь Konrad Rudolph выступает за DirectCast () в вопросе переполнения стека "Скрытые возможности VB.NET" .

Зак Петерсон
источник
-1, потому что DirectCast явно НЕ подходит здесь, за исключением очень ограниченных ситуаций, о которых вы не удосужились упомянуть. DirectCast хорош, когда вы знаете, что у вас есть два СООТВЕТСТВУЮЩИХ ТИПА ССЫЛКИ, и вы хотите, чтобы между ними было эффективное приведение. Поскольку вопрос касается получения String, маловероятно, что ОП обсуждал ситуацию, когда DirectCast подходит.
ToolmakerSteve
... Если бы вопрос не упоминался Stringи ToStringмоя жалоба не была бы применима. Вы не должны защищать DirectCast, пока вы не сузили тему от общего КОНВЕРСИЯ.
ToolmakerSteve
1

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

SickPuP
источник
1
К сведению Пола Вика (Paul Vick) из Microsoft, операторы Cxxx были быстрее, чем функции Convert.Toxxx, по крайней мере в 2004 году, поскольку Cxxx компилируется непосредственно в IL, а не вызывает функцию. Хотя его обоснование кажется сомнительным, учитывая возможность JIT-оптимизации вызовов функций. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve
0

Когда-то я помню, как видел состояние библиотеки MSDN, чтобы использовать CStr (), потому что это было быстрее. Я не знаю, правда ли это, хотя.

joek1975
источник
2
DirectCast работает быстрее, чем CStr, но вы можете использовать его только при преобразовании строкового объекта в строковую переменную. Это не удастся, если вы попытаетесь преобразовать любой другой объект в строку.
Джонатан Аллен