Все ли они равны? При каких обстоятельствах я должен выбирать друг друга?
var.ToString ()
CStr (вар)
CType (var, String)
DirectCast (var, String)
РЕДАКТИРОВАТЬ: Предложение от NotMyself ...
- TryCast (var, String)
Все ли они равны? При каких обстоятельствах я должен выбирать друг друга?
var.ToString ()
CStr (вар)
CType (var, String)
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значение
CStr(var)будет подавлять и вызывать исключение, если переменная DBNull.Value, но альтернатива Convert.ToString(var)вернет пустую строку.
Dim myList AS ArrayList=new ArrayList Когда пишешь (From e In myList select CType(e.Name,String)).ToArray() это не работает. Я пришел, чтобы написать, ... select CType(e.Name.ToString,String)).ToArray()и я восстановил свою улыбку.
Cstr() компилируется для лучшей производительности.
CType допускает приведение между типами, если определен оператор преобразования
ToString() Между базовым типом и строкой выдается исключение, если преобразование невозможно.
TryParse()Из String в base typeifвозможно, иначе возвращает false
DirectCastиспользуется, если типы связаны через наследование или совместно используют общий интерфейс, выдаст исключение, если приведение невозможно, trycastничего не даст в этом случае
Похоже, что MSDN указывает, что приведение Cxxx для определенных типов может повысить производительность в VB .NET, поскольку они преобразуются во встроенный код. По некоторым причинам, он также предлагает DirectCast в отличие от CType в некоторых случаях (в документации говорится, что это когда есть отношение наследования; я считаю, что это означает, что целостность приведения проверяется во время компиляции и может применяться оптимизация, тогда как CType всегда использует VB runtime.)
Когда я пишу код 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 (число) или число. ToString () является безопасным. В общем случае (не только типы значений) CStr (что угодно) является безопасным, потому что он может ничего не обрабатывать - результатом будет Nothing в переменной String. TryCast очень полезен - только не здесь.
Пользователь Konrad Rudolph выступает за DirectCast () в вопросе переполнения стека "Скрытые возможности VB.NET" .
String, маловероятно, что ОП обсуждал ситуацию, когда DirectCast подходит.
Stringи ToStringмоя жалоба не была бы применима. Вы не должны защищать DirectCast, пока вы не сузили тему от общего КОНВЕРСИЯ.
В соответствии с сертификационным экзаменом вы должны по возможности использовать Convert.ToXXX () для простых преобразований, поскольку он оптимизирует производительность лучше, чем преобразования CXXX.
Когда-то я помню, как видел состояние библиотеки MSDN, чтобы использовать CStr (), потому что это было быстрее. Я не знаю, правда ли это, хотя.