簡體   English   中英

如何在VB.NET中進行C風格轉換?

[英]How can I do C style casting in VB.NET?

我有一個對象類型變量(control .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屬性的使用(所以請不要建議,這不是一個選項)來存儲這些結構,設置成員的最快方法是什么?

似乎DirectCast實際上是一個函數,並沒有按照我解釋它的方式進行轉換。

不,那是錯的: DirectCast不是一種方法,它是一種真正的語言結構,就像C語言中的DirectCast一樣。

但是 ,如果在對象中存儲結構(=值類型),它將被裝箱 ,並因此被復制 這導致了這里的問題:您正在嘗試修改副本,而不是原始的盒裝對象。

因此,為了更改盒裝值類型對象的成員,您需要復制對象,更改其值並將其復制回來:

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

順便提一下,盡管與C cast語法表面相似,但在C#中也是如此。

這就是你應該如何施展 - 使用CType:

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

為什么一個結構而不是一個類?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM