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

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

  • var.ToString ()

  • CStr (var)

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

  • DirectCast (var, String)


Обновлено: Предложение от NotMyself

  • TryCast (var, String)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
151
0
162 842
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

If str IsNot Nothing Then

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

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

Думаю, ты ошибаешься. вообще не рекомендуется использовать TryCast. в таком случае следует использовать number.ToString () или CStr (number).

Shimmy Weitzhandler 09.11.2010 03:35

@Shimmy: В чем причина того, что TryCast вообще не используется? Не лучше ли DirectCast избежать исключения в определенных сценариях?

Dienekes 04.03.2011 07:00

@Dienekes и NotMyself. TryCast предназначен только для типов REFERENCE. Здесь у нас есть целое число, которое является типом VALUE. Компилятор отклонит TryCast. Кроме того, цель - строка. Любой объект .Net, кроме Nothing, поддерживает .ToString(). Тип значения, например Integer, не может быть Nothing. Таким образом, в этом случае безопасно использовать CStr (number) или number.ToString (). В общем случае (не только для типов значений) CStr (что угодно) является безопасным, потому что он может обрабатывать Nothing - результатом будет Nothing в переменной String. TryCast очень полезен - только не здесь.

ToolmakerSteve 19.03.2014 07:05
Ответ принят как подходящий

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

  • 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 также имеет хорошее сравнение.

Нет причин использовать CType (var, String) вместо CStr (var), они делают то же самое.

Jonathan Allen 09.09.2008 12:07

@Maslow TryCast работает только для типов значений, поскольку он должен быть типом, который может иметь Nothing в качестве значения

bdukes 28.07.2010 18:21

@Martinho совершенно прав. Это должно сказать, что "работает только для типа ссылка"

bdukes 16.12.2010 18:10

CStr(var) задушит и вызовет исключение, если переменная равна DBNull.Value, но альтернативный Convert.ToString(var) вернет пустую строку.

MCattle 03.04.2013 21:25

Dim myList AS ArrayList=new ArrayList Когда вы пишете (From e In myList select CType(e.Name,String)).ToArray(), это не работает. Я пришел написать ... select CType(e.Name.ToString,String)).ToArray() и получил улыбку.

Bellash 26.03.2014 01:13

К сожалению, TryCast от VB даже не работает с значениями NULL, в отличие от as в C#. Например, myObject as double? совершенно законен и возвращает null, если приведение не выполняется, но TryCast(myObject, Double?) выдает ошибку компилятора.

Teejay 19.09.2018 18:58

DirectCast (var, String) используется для преобразования объекта в строку. => это подавленный

yi.han 01.02.2021 20:11

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

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

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

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

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

Jonathan Allen 09.09.2008 12:08

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

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

ToolmakerSteve 19.03.2014 07:12

... Если бы в вопросе не упоминались String и ToString, моя жалоба не применялась бы. Вы не должны пропагандировать DirectCast, пока не сузите тему до общей КОНВЕРСИИ.

ToolmakerSteve 19.03.2014 07:19

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

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

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

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

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

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

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

ToolmakerSteve 19.03.2014 07:29

Другие вопросы по теме