Все ли они равны? При каких обстоятельствах я должен предпочесть одно другому?
var.ToString ()
CStr (var)
CType (вар; строка)
DirectCast (var, String)
ИЗМЕНИТЬ: предложение от NotMyself
- TryCast (var, String)
Все ли они равны? При каких обстоятельствах я должен предпочесть одно другому?
var.ToString ()
CStr (var)
CType (вар; строка)
DirectCast (var, String)
ИЗМЕНИТЬ: предложение от NotMyself
Все они немного отличаются и обычно имеют приемлемое использование.
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 тоже имеет хорошее сравнение.TryCast
работает только для типов значений, поскольку он должен быть типом, который может иметь Nothing
в качестве значения
- person bdukes; 28.07.2010
CStr(var)
подавит и вызовет исключение, если переменная равна DBNull.Value, но альтернативный Convert.ToString(var)
вернет пустую строку.
- person MCattle; 03.04.2013
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
TryCast
в VB даже не работает с значениями NULL, в отличие от as
в C #. Например, myObject as double?
совершенно законен и возвращает ноль, если приведение завершилось неудачно, но TryCast(myObject, Double?)
выдает ошибку компилятора.
- person Teejay; 19.09.2018
Cstr()
скомпилирован для лучшей производительности.
CType
допускает приведение типов между типами, если определен оператор преобразования
ToString()
Между базовым типом и строкой выдается исключение, если преобразование невозможно.
TryParse()
От строки к основанию 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, не может быть Nothing. Таким образом, в этом случае безопасно использовать CStr (number) или number.ToString (). В общем случае (не только для типов значений) CStr (что угодно) является безопасным, потому что он может обрабатывать Nothing - результатом будет Nothing в переменной String. TryCast очень полезен - только не здесь.
- person ToolmakerSteve; 19.03.2014
Пользователь Конрад Рудольф защищает для DirectCast () в вопросе о переполнении стека" Скрытые возможности VB.NET ".
String
, маловероятно, что OP обсуждал ситуацию, в которой уместен DirectCast.
- person ToolmakerSteve; 19.03.2014
String
и ToString
, моя жалоба не применялась бы. Вы не должны пропагандировать DirectCast, пока не сузите тему до общей КОНВЕРСИИ.
- person ToolmakerSteve; 19.03.2014
Согласно сертификационному экзамену, вы должны по возможности использовать Convert.ToXXX () для простых преобразований, поскольку он оптимизирует производительность лучше, чем преобразования CXXX.
Одно время я помню, как видел состояние библиотеки MSDN для использования CStr (), потому что это было быстрее. Но я не знаю, правда ли это.