【问题标题】:Option Strict and Unboxing Object to StringOption Strict 和将对象拆箱为字符串
【发布时间】:2013-06-21 07:03:06
【问题描述】:

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

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.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

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

【问题讨论】:

  • 不,CStr() 不是回归。如果您愿意,可以改用对象的 ToString() 方法。它实际上是 VB6 回归的 Tag 属性。通常,您可以通过将模型与视图分离来避免使用它。
  • Tag 出现在大多数(如果不是全部)控件上。我看不出在某些情况下使用它有什么问题。我不知道 TS 的情况,但它本身并不是倒退;)。

标签: vb.net string treenode unboxing


【解决方案1】:

我有点困惑如何最好地从 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 可能是合适的。

【讨论】:

  • 这就是问题所在,有时标签会保留为Nothing,但这是唯一的例外。如果标签中有任何内容,我知道它是String。我想我可能需要像DirectCast( tn.Tag, String) 这样的方法,它足够聪明,可以将Nothingtn.Tag 值转换为StringNothing 值。
  • 我测试了代码,结果发现 DirectCast 实际上在这里可以正常工作,即使标签什么都没有,所以这对我来说是一个完整的解决方案。
【解决方案2】:

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

DoTagStringStuff(CStr(tn.Tag))

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

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

DoTagStringStuff(DirectCast(tn.Tag, String))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多