我有一个树视图,其中一些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
除非我不再检查空字符串或仅空白字符串。
答案 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
语法,则可以使用DirectCast
或CType
。 CStr
基本上只是CType(x, String)
的简写。虽然VB6中确实存在CStr
,但使用它并不被认为是过时的。它仍然被认为是核心VB.NET语言的一个功能。
从技术上讲,既然你知道该属性引用了一个String
对象,那么最好的选择实际上是DirectCast
:
DoTagStringStuff(DirectCast(tn.Tag, String))
当您不打算对值进行任何转换时, DirectCast
会稍微提高效率。作为附带好处,它更具有自我记录功能。读取该行的任何人都会知道Tag
是对String
对象的引用,而如果您使用CStr
或ToString
,则不会显而易见。< / p>