Как мне использовать VB.NET?

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

  • var.ToString ()

  • CStr (var)

  • CType (вар; строка)

  • DirectCast (var, String)


ИЗМЕНИТЬ: предложение от NotMyself

  • TryCast (var, String)

person Zack Peterson    schedule 02.09.2008    source источник


Ответы (7)


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

  • 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 тоже имеет хорошее сравнение.
person bdukes    schedule 02.09.2008
comment
Нет причин использовать CType (var, String) вместо CStr (var), они делают то же самое. - person Jonathan Allen; 09.09.2008
comment
@Maslow TryCast работает только для типов значений, поскольку он должен быть типом, который может иметь Nothing в качестве значения - person bdukes; 28.07.2010
comment
@Martinho совершенно прав. Это должно сказать, что работает только для типа reference. - person bdukes; 16.12.2010
comment
CStr(var) подавит и вызовет исключение, если переменная равна DBNull.Value, но альтернативный Convert.ToString(var) вернет пустую строку. - person MCattle; 03.04.2013
comment
Dim myList AS ArrayList=new ArrayList Когда вы пишете (From e In myList select CType(e.Name,String)).ToArray(), это не работает. Я пришел написать ... select CType(e.Name.ToString,String)).ToArray() и получил улыбку. - person Bellash; 26.03.2014
comment
К сожалению, TryCast в VB даже не работает с значениями NULL, в отличие от as в C #. Например, myObject as double? совершенно законен и возвращает ноль, если приведение завершилось неудачно, но TryCast(myObject, Double?) выдает ошибку компилятора. - person Teejay; 19.09.2018
comment
DirectCast (var, String) используется для преобразования объекта в строку. = ›Это подавленный - person yi.han; 01.02.2021

Cstr() скомпилирован для лучшей производительности.

CType допускает приведение типов между типами, если определен оператор преобразования

ToString() Между базовым типом и строкой выдается исключение, если преобразование невозможно.

TryParse() От строки к основанию typeif возможно, в противном случае возвращается false

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

person Community    schedule 25.11.2008

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

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

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

person OwenP    schedule 02.09.2008

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

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

If str IsNot Nothing Then

Как вы понимаете, я обычно пишу код на C #. 8)

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

person NotMyself    schedule 02.09.2008
comment
Думаю, ты ошибаешься. вообще не рекомендуется использовать TryCast. в таком случае следует использовать number.ToString () или CStr (number). - person Shimmy Weitzhandler; 09.11.2010
comment
@Shimmy: В чем причина того, что TryCast вообще не используется? Не лучше ли DirectCast избежать исключения в определенных сценариях? - person Dienekes; 04.03.2011
comment
@Dienekes и NotMyself. TryCast предназначен только для типов REFERENCE. Здесь у нас есть целое число, которое является типом VALUE. Компилятор отклонит TryCast. Также цель - строка. Любой объект .Net, кроме Nothing, поддерживает .ToString(). Тип значения, например Integer, не может быть Nothing. Таким образом, в этом случае безопасно использовать CStr (number) или number.ToString (). В общем случае (не только для типов значений) CStr (что угодно) является безопасным, потому что он может обрабатывать Nothing - результатом будет Nothing в переменной String. TryCast очень полезен - только не здесь. - person ToolmakerSteve; 19.03.2014

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

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

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

person SickPuP    schedule 16.03.2011
comment
К вашему сведению, по словам Пола Вика из Microsoft, операторы Cxxx были быстрее, чем функции Convert.Toxxx, по крайней мере, в 2004 году, потому что Cxxx компилируется непосредственно в IL, а не вызывает функцию. Хотя его обоснование кажется сомнительным, учитывая возможность JIT-оптимизации вызовов функций. Panopticoncentral.net/2004/05/31/the-native -net-language - person ToolmakerSteve; 19.03.2014

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

person joek1975    schedule 05.09.2008
comment
DirectCast быстрее, чем CStr, но вы можете использовать его только при преобразовании строкового объекта в строковую переменную. Он потерпит неудачу, если вы попытаетесь преобразовать любой другой объект в строку. - person Jonathan Allen; 09.09.2008