【问题标题】:How can I do C style casting in VB.NET?如何在 VB.NET 中进行 C 样式转换?
【发布时间】:2011-10-30 15:22:03
【问题描述】:

我有一个对象类型变量(控件 .Tag),我需要将其转换为结构化类型,并更改其中的成员。这是一个人为但具有代表性的示例:

Public Structure struct_COLOURS
  Dim ILikeRed as boolean
  Dim ILikeGreen as boolean
End Structure

Dim AnObject as Object = (some source that is struct_COLOURS)

DirectCast(AnObject, struct_COLOURS).ILikeRed = True ' This is not valid syntax?!

我不太记得我的 C 语法,但应该是这样的:

(struct_COLOURS*)AnObject->ILikeRed = true;

关键是我可以将一个对象投射到某物上并在结果投射中设置成员。似乎 DirectCast 实际上是一个函数,并且没有以我解释它的方式进行转换。

奇怪的是,如果你只想检索一个成员值,你可以使用 DirectCast:

dim YummyRed AS Boolean = DirectCast(AnObject, struct_COLOURS).ILikeRed

没问题!

如果我不能按我想要的方式进行转换,并且我无法更改 Tag 属性的使用(所以请不要建议,这不是一个选项)来存储这些结构,那么设置成员的最快方法是什么?

【问题讨论】:

    标签: vb.net ctype directcast


    【解决方案1】:

    似乎 DirectCast 实际上是一个函数,而不是按照我的解释方式进行转换。

    不,这是错误的:DirectCast 不是一种方法,而是一种真正的语言结构,就像 C 中的强制转换。

    然而,如果您在对象中存储一个结构(= 值类型),它会得到boxed,因此,已复制。这导致了这里的问题:您正在尝试修改副本,而不是原始的装箱对象。

    所以为了改变一个装箱值类型对象的成员,你需要复制这个对象,改变它的值,然后把它复制回来:

    Dim tmp = DirectCast(AnObject, struct_COLOURS)
    tmp.ILikeRed = True
    AnObject = tmp
    

    顺便说一句,在 C# 中也是如此,尽管表面上与 C 强制转换语法相似。

    【讨论】:

    • 我如何在里面放一些没有装箱但有结构的东西?
    • 好的。我如何将所有结构存储在一个单独的类型数组中,而标签只包含索引?这种关系在控件的生命周期内是一致的。我需要更改大量代码,但无论如何将数据移出标签对象是一个长期目标,只是我现在不想解决这个问题。
    • @Mark 值类型在存储在 Object 中时总是被装箱,这是没有办法的。在您的情况下,将索引存储到全局数组可能是一个可接受的解决方案。
    • 我的最后一条评论跑题了。我为什么不直接派生我自己的控件并将结构作为一个属性或许多属性。意味着我想避免大量更改,但这意味着每次我想查询结构时都无需担心对象类型。
    • @Mark 这可能是最干净的解决方案,但可能有点矫枉过正。
    【解决方案2】:

    这就是你应该如何投射 - 使用 CType:

    Dim myColor As Object = Nothing
            Dim color As Color = CType(myColor, Color)
            color.Name = "red"
    

    为什么是结构而不是类?

    【讨论】:

    • 不,那是错误的。首先,这与问题无关。其次,CType 在这里不是首选。事实上,DirectCast 应该始终是首选,因为它更具限制性并且允许更好的类型检查。第三,通过声明 myColor 而不立即初始化它,您的代码不符合良好的风格。
    • 如果您只想以有组织的方式存储一组变量,那么一个类就太过分了。一个结构是或者应该是非常有效的,因为它只是以某种方式读取的一块内存。此外,一个类不是必须以相同的方式转换吗?
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 2023-03-13
    • 2022-01-17
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多