Опция 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 2

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, это не было бы очевидно.