




Я предпочитаю следующий синтаксис:
Dim number As Integer = 1
Dim str As String = String.TryCast(number)
If str IsNot Nothing Then
Как вы понимаете, я обычно пишу код на C#. 8)
Причина, по которой я предпочитаю TryCast, заключается в том, что вам не нужно возиться с накладными расходами на кастинг исключений. Ваше приведение либо выполнено успешно, либо ваша переменная инициализируется значением null, и вы соответственно справляетесь с этим.
@Shimmy: В чем причина того, что TryCast вообще не используется? Не лучше ли DirectCast избежать исключения в определенных сценариях?
@Dienekes и NotMyself. TryCast предназначен только для типов REFERENCE. Здесь у нас есть целое число, которое является типом VALUE. Компилятор отклонит TryCast. Кроме того, цель - строка. Любой объект .Net, кроме Nothing, поддерживает .ToString(). Тип значения, например Integer, не может быть Nothing. Таким образом, в этом случае безопасно использовать CStr (number) или number.ToString (). В общем случае (не только для типов значений) CStr (что угодно) является безопасным, потому что он может обрабатывать Nothing - результатом будет Nothing в переменной String. TryCast очень полезен - только не здесь.
Все они немного отличаются и обычно имеют приемлемое использование.
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), они делают то же самое.
@Maslow TryCast работает только для типов значений, поскольку он должен быть типом, который может иметь Nothing в качестве значения
@Martinho совершенно прав. Это должно сказать, что "работает только для типа ссылка"
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() и получил улыбку.
К сожалению, TryCast от VB даже не работает с значениями NULL, в отличие от as в C#. Например, myObject as double? совершенно законен и возвращает null, если приведение не выполняется, но TryCast(myObject, Double?) выдает ошибку компилятора.
DirectCast (var, String) используется для преобразования объекта в строку. => это подавленный
MSDN, похоже, указывает на то, что приведение Cxxx для определенных типов может улучшить производительность в VB .NET, поскольку они преобразуются во встроенный код. По какой-то причине в некоторых случаях он также предлагает DirectCast в отличие от CType (в документации указано, что это когда есть отношения наследования; я считаю, что это означает, что корректность приведения проверяется во время компиляции и могут применяться оптимизации, тогда как CType всегда использует Среда выполнения VB.)
Когда я пишу код VB .NET, то, что я использую, зависит от того, что я делаю. Если это код прототипа, который я собираюсь выбросить, я использую все, что набираю. Если я серьезно отношусь к этому коду, я пытаюсь использовать приведение Cxxx. Если таковой не существует, я использую DirectCast, если у меня есть разумные основания полагать, что существует отношение наследования. Если это ситуация, когда я понятия не имею, должно ли приведение преуспеть (например, ввод пользователя -> целые числа), то я использую TryCast, чтобы сделать что-то более дружелюбное, чем бросать исключение пользователю.
Единственное, чего я не могу избежать, это то, что я предпочитаю использовать ToString вместо CStr, но, предположительно, Cstr быстрее.
Одно время я помню, как видел состояние библиотеки MSDN для использования CStr (), потому что это было быстрее. Но я не знаю, правда ли это.
DirectCast быстрее, чем CStr, но вы можете использовать его только при преобразовании строкового объекта в строковую переменную. Он потерпит неудачу, если вы попытаетесь преобразовать любой другой объект в строку.
Пользователь Конрад Рудольф поддерживает для DirectCast () в вопросе переполнения стека "Скрытые возможности VB.NET".
-1, потому что DirectCast здесь явно НЕ подходит, за исключением очень ограниченной ситуации, о которой вы не удосужились упомянуть. DirectCast хорош, когда вы знаете, что у вас есть два СВЯЗАННЫХ ТИПА ССЫЛКИ, и вам нужно эффективное преобразование между ними. Поскольку речь идет о получении String, маловероятно, что OP обсуждал ситуацию, в которой уместен DirectCast.
... Если бы в вопросе не упоминались String и ToString, моя жалоба не применялась бы. Вы не должны пропагандировать DirectCast, пока не сузите тему до общей КОНВЕРСИИ.
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
Думаю, ты ошибаешься. вообще не рекомендуется использовать TryCast. в таком случае следует использовать number.ToString () или CStr (number).