Option Strict和Unboxing Object to String

时间:2013-06-24 17:11:16

标签: vb.net string treenode unboxing

我有一个树视图,其中一些treenode将一个字符串保存到其标记对象中,而一些标记则保留为空。后来我想在它们存在的节点中使用字符串。

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时,我会在运行时收到错误。

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

编辑:我想也许这是正确的?

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 个答案:

答案 0 :(得分:0)

  

我对如何最好地从treenode.tag对象中取消包装字符串感到困惑。

首先,此处不涉及装箱或拆箱。由于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可能为空,那么other conversions可能是合适的。

答案 1 :(得分:0)

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

DoTagStringStuff(CStr(tn.Tag))

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

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

DoTagStringStuff(DirectCast(tn.Tag, String))
当您不打算对值进行任何转换时,

DirectCast会稍微提高效率。作为附带好处,它更具有自我记录功能。读取该行的任何人都会知道Tag是对String对象的引用,而如果您使用CStrToString,则不会显而易见。< / p>