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

126

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

  • var.ToString()

  • CStr (вар)

  • CType (var, String)

  • DirectCast (var, String)


EDIT: предложение от NotMyself & hellip;

  • TryCast (var, String)
Теги:
casting

7 ответов

126
Лучший ответ

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

  • var. ToString () собирается дать вам строковое представление объекта, независимо от того, какой он тип. Используйте это, если var уже не строка.
  • CStr (var) - оператор строковой трансляции VB. Я не парень VB, поэтому я бы предложил избегать этого, но на самом деле это ничего не повредит. Я думаю, что это в основном то же самое, что CType.
  • CType (var, String) преобразует данный тип в строку, используя любые предоставленные операторы преобразования.
  • DirectCast (var, String) используется для добавления объекта в строку. Если вы знаете, что объектная переменная является, по сути, строкой, используйте это. Это то же самое, что и (string)var в С#.
  • TryCast (как упоминается @NotMyself), как DirectCast, но он вернет Nothing, если переменная не может быть преобразована в строку, а не выбрасывает исключение. Это то же самое, что и var as string в С#. На странице TryCast в MSDN также есть хорошее сравнение.
  • 15
    Нет никакой причины использовать CType (var, String) вместо CStr (var), они делают то же самое.
  • 0
    trycast явно не работает с Enums
Показать ещё 6 комментариев
9

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

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

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

TryParse() От String до base typeif возможно в противном случае возвращает false

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

8

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

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

If str IsNot Nothing Then

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

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

  • 1
    Я думаю, что ты не прав. не стоит использовать TryCast вообще. в случае, подобном вашему, следует использовать number.ToString () или CStr (число).
  • 4
    @Shimmy: В чем причина неиспользования TryCast? Не лучше ли DirectCast избегать исключений в определенных сценариях?
Показать ещё 1 комментарий
7

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

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

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

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню