2011-08-19 37 views
3

我有一個對象類型變量(控制.TAG),我需要轉換爲結構化類型,並更改成員這是一個人爲的,但代表性的例子:如何在VB.NET中進行C風格的投射?

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屬性(所以請不要暗示,這不是一種選擇)來存儲這些結構,設置成員的最快方法是什麼?

回答

7

看起來好像DirectCast實際上是一個函數,並沒有按照我解釋它的方式進行投射。

不,那是錯誤的:DirectCast不是方法,它是一個真正的語言結構,就像在C.

然而一投,如果你存儲結構(=值類型)在對象,它得到boxed,結果,複製。這在這裏引起了問題:您正試圖修改副本,而不是原始的盒裝對象。

所以爲了改變裝箱值類型的對象中的一員,你需要複製的對象,更改它的值,並將其複製回:

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

順便說一下,同樣是在C#真的,儘管表面上與C語言的語法相似。

+0

我該如何在那裏放置那些沒有裝箱但結構化的東西? –

+0

好的。如何將所有結構存儲在單獨的類型數組中,並且標記只包含索引?這種關係對於控件的生命週期是一致的。我需要更改很多代碼,但將數據從標籤對象中移出是一個長期目標,無論如何,我現在都不想解決這個問題。 –

+0

@Mark Value類型在存儲在「Object」中時總是* boxed,這是沒有辦法的。對於您的情況,將索引存儲到全局數組可能是一個可接受的解決方案。 –

-2

這就是你應該怎樣投 - 用CTYPE:

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

爲什麼一個結構,而不是一類?

+2

不,這是錯誤的。首先,這與問題無關。其次,'CType'在這裏不是首選。事實上,「DirectCast」應該始終是首選,因爲它更具限制性,並允許更好的類型檢查。第三,通過聲明'myColor'而不用初始化它,你的代碼不會遵循好的風格。 –

+0

如果您想要做的只是以有組織的方式存儲變量集合,那麼類就會過度殺傷。結構是或應該是非常有效的,因爲它只是以一定的方式讀取一塊內存。此外,是不是要以同樣的方式施放班級? –