Опция Strict и распаковка объекта в строку
У меня есть treeview, где некоторые из treenodes имеют строку, сохраненную в их объекте тега, а некоторые теги остаются пустыми. Позже я хочу использовать строки для чего-то, в узлах, где они существуют.
For Each tn As TreeNode In TreeView1.Nodes
If Not String.IsNullOrWhiteSpace(tn.Tag) Then
Call DoTagStringStuff(tn.Tag)
End If
Next tn
Это работало нормально, пока мне не пришлось включить опцию strict, чтобы сделать мой код совместимым с проектом коллег. Я немного запутался в том, как лучше всего распаковать строку из treenode.объект тега.
Всплывающее окно ошибки предлагает использовать CStr
, но я был под впечатление, что функция CStr
была только в VB.net как возврат к VB6, и действительно не должен использоваться для нового кода. Если я попытаюсь tn.Tag.toString
в приведенном выше коде, я получу ошибку во время выполнения, когда он не сможет вычислить Nothing.toString
.
Как правильно это исправить? Должен ли я вообще использовать объект tag для хранения строковых значений в первую очередь, или есть лучшее свойство treenode, которое не требует распаковки, которое я могу использовать для этого?
Edit: я думаю, что, возможно, это было бы правильно?
For Each tn As TreeNode In theNode.Nodes
If tn.Tag IsNot Nothing Then
Call DoTagStringStuff(DirectCast(tn.Tag, String))
End If
Next tn
За исключением того, что я больше не проверяю пустую или только пустую строку.
2 ответа:
Во-первых, здесь нет никакого бокса или распаковки. ПосколькуЯ немного запутался в том, как лучше всего распаковать строку из treenode.объект тега.
String
является классом, переменнаяObject
может непосредственно содержать ссылку наString
без бокса. Бокс происходит, когда вы храните тип значения (Structure
) в переменнойObject
.Это, как говорится, - чтобы извлечь значение, так как вы знаете, что вы всегда храните
String
, вы можете использоватьDirectCast
, чтобы вытащить значение:For Each tn As TreeNode In TreeView1.Nodes Dim tag = DirectCast(tn.Tag, String) If Not String.IsNullOrWhiteSpace(tag) Then Call DoTagStringStuff(tag) End If Next tn
Если другие типы потенциально могут быть сохранены в
Tag
, или еслиTag
может быть оставлено пустым, то другие преобразования могут быть уместны.
Использование
CStr
для приведения / преобразования тега в строку абсолютно законно:DoTagStringStuff(CStr(tn.Tag))
Если вам не нравится синтаксис
CStr
, Вы можете использовать вместо него либоDirectCast
, либоCType
.CStr
по сути является просто сокращением дляCType(x, String)
. ХотяCStr
действительно существовал в VB6, его использование не считается устаревшим. Это все еще считается функцией ядра VB.NET язык.Технически, поскольку вы знаете, что свойство ссылается на объект
String
, лучшим выбором на самом деле будетDirectCast
:DoTagStringStuff(DirectCast(tn.Tag, String))
DirectCast
немного эффективнее, если вы не собираетесь проводить конвертацию значения. Как побочное преимущество, это больше самописания. Любой, кто прочтет эту строку, будет знать, чтоTag
является ссылкой на объектString
, тогда как если бы вы использовалиCStr
илиToString
, это не было бы очевидно.