2

我有一个树视图,其中一些树节点将一个字符串保存到它们的标签对象中,而一些标签则什么都没有。稍后我想在它们存在的节点中使用字符串。

For Each tn As TreeNode In TreeView1.Nodes
    If Not String.IsNullOrWhiteSpace(tn.Tag) Then
        Call DoTagStringStuff(tn.Tag)
    End If
Next tn

这工作得很好,直到我需要打开选项严格以使我的代码与同事项目兼容。我对如何最好地从 treenode.tag 对象中拆箱字符串有点困惑。

错误弹出窗口建议使用CStr,但我的印象是该CStr函数仅在 VB.net 中作为对 VB6 的回归,并且真的不应该用于新代码。如果我tn.Tag.toString在上面的代码中尝试,当它无法计算时,我会在运行时得到一个错误Nothing.toString

解决此问题的正确方法是什么?我是否应该首先使用标记对象来保存字符串值,或者是否有更好的不需要拆箱的树节点属性可以用于此目的?

编辑:我认为这可能是正确的?

For Each tn As TreeNode In theNode.Nodes
    If tn.Tag IsNot Nothing Then
        Call DoTagStringStuff(DirectCast(tn.Tag, String))
    End If
Next tn

除了我不再检查空字符串或只有空格字符串。

4

2 回答 2

0

使用CStr将标签转换/转换为字符串是完全合法的:

DoTagStringStuff(CStr(tn.Tag))

如果您不关心CStr语法,则可以使用DirectCastorCType代替。 CStr本质上只是CType(x, String). 虽然CStr在 VB6 中确实存在,但使用它并没有被认为是过时的。它仍然被认为是核心 VB.NET 语言的功能。

从技术上讲,既然您知道该属性引用了一个String对象,那么最好的选择实际上是DirectCast

DoTagStringStuff(DirectCast(tn.Tag, String))

DirectCast当您不打算进行任何价值转换时,效率会稍高一些。作为附带的好处,它更具自我记录性。任何阅读该行的人都会知道这Tag是对对象的引用String,而如果您使用CStror ToString,那将不明显。

于 2013-06-24T17:17:21.123 回答
0

我对如何最好地从 treenode.tag 对象中拆箱字符串有点困惑。

首先,这里不涉及装箱或拆箱。由于String是一个类,一个Object变量可以直接持有对 a 的引用而String无需装箱。当您将值类型 ( Structure) 存储在Object变量中时,就会发生装箱。

话虽如此 - 要提取值,因为您知道您总是存储 a 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可能留空,则其他转换 可能是合适的。

于 2013-06-24T17:14:44.900 回答