2011-08-19 2 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?! 

내가 기억하지 않습니다 내

(struct_COLOURS*)AnObject->ILikeRed = true; 

요점은 내가 결과 캐스트 멤버를 뭔가에 개체를 캐스팅하고 설정할 수 있습니다 : C 구문은 매우 잘하지만,이 같은 것입니다. 그것은 마치 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 값 타입은'Object'에 저장 될 때 항상 boxed됩니다. 색인을 전역 배열에 저장하는 것이 적절한 해결책이 될 수 있습니다. –

-2

은 즉, 주조 방법입니다 -에서는 CType로 :

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

왜 구조체가 아닌 클래스?

+2

아니, 그게 틀렸어. 우선, 그 문제와 관련이 없습니다. 둘째, 'CType'이 여기서는 선호되지 않습니다.실제로,'DirectCast'는 더 제한적이고 더 나은 유형 검사를 허용하기 때문에 항상 선호되어야합니다. 셋째, 코드를 바로 초기화하지 않고'myColor'를 선언함으로써 좋은 스타일을 따르지 않습니다. –

+0

당신이하고 싶은 일은 체계적인 방식으로 변수 콜렉션을 저장하는 것이다. 구조는 특정 방식으로 읽혀지는 메모리 덩어리이기 때문에 매우 효율적이거나 그렇게해야합니다. 게다가, 수업이 같은 방식으로 캐스팅되어야하지 않을까요? –

관련 문제