[英]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.