2013-06-24 3 views
2

일부 트리 노드에는 태그 객체에 저장된 문자열이 있고 일부 태그는 아무 것도 남지 않는 트리 뷰가 있습니다. 나중에 내가 존재하는 노드에서 문자열을 무언가에 사용하고 싶습니다.Option Strict and Unboxing Object to String

For Each tn As TreeNode In TreeView1.Nodes 
    If Not String.IsNullOrWhiteSpace(tn.Tag) Then 
     Call DoTagStringStuff(tn.Tag) 
    End If 
Next tn 

엄격한 옵션을 설정해야 동료 코드 프로젝트와 호환 될 수있을 때까지 제대로 작동했습니다. 나는 treenode.tag 객체에서 문자열을 가장 잘 unbox하는 방법에 대해 약간 혼란 스럽다.

오류 팝업은 CStr을 사용하는 것이 좋습니다.하지만 VB.net에서만 CStr 함수가 VB.net에서만 사용되었다는 인상을 받았으며 실제로는 새로운 코드에 사용해서는 안됩니다. 위의 코드에서 tn.Tag.toString을 시도하면 Nothing.toString을 계산하지 못하면 런타임에 오류가 발생합니다.

이 문제를 해결하는 올바른 방법은 무엇입니까? 나는 태그 객체를 사용하여 문자열 값을 첫 번째 위치에 유지해야할까요, 아니면 언 박싱이 필요하지 않은 더 나은 treenode 속성이 있습니까?

편집 : 아마도 이것이 맞을 것 같습니까?

For Each tn As TreeNode In theNode.Nodes 
    If tn.Tag IsNot Nothing Then 
     Call DoTagStringStuff(DirectCast(tn.Tag, String)) 
    End If 
Next tn 

저는 공백 또는 공백 문자열을 더 이상 확인하지 않습니다.

+0

아니요, CStr()은 지연되지 않습니다. 원하는 경우 개체의 ToString() 메서드를 대신 사용할 수 있습니다. 사실 VB6 던짐 태그 속성입니다. 일반적으로보기에서 모델을 분리하여 사용하지 마십시오. –

+0

'Tag '는 대부분의 (전부는 아닐지라도) 컨트롤에 존재합니다. 어떤 경우에는 이것을 사용하는 문제가 보이지 않습니다. 나는 TS의 경우를 모른다. 그러나 그것은 본질적으로 뒤늦은 것이 아니다.). – Styxxy

답변

0

treenode.tag 개체의 문자열을 unbox하는 방법에 대해 혼란스러워합니다.

첫째로, 복싱이나 언 박싱은 여기에 관여하지 않습니다. String은 클래스이므로 Object 변수는 권투없이 String에 대한 참조를 직접 보유 할 수 있습니다. 복싱은 Object 변수 내에 값 유형 (Structure)을 저장할 때 발생합니다. 다른 유형은 잠재적으로 저장 될 수 있다면

For Each tn As TreeNode In TreeView1.Nodes 
    Dim tag = DirectCast(tn.Tag, String) 
    If Not String.IsNullOrWhiteSpace(tag) Then 
     Call DoTagStringStuff(tag) 
    End If 
Next tn 

: - 밝혔다되고 그건

당신이 항상 String를 저장하고 알고 있기 때문에 당신이 값을 꺼내 DirectCast를 사용하여, 값을 추출 Tag이거나 Tag이 비어있을 수있는 경우 other conversions이 적합 할 수 있습니다. 문자열에 태그를/캐스트 변환 CStr를 사용

+0

그건 그냥 문제, 때로는 태그가'Nothing'으로 남았습니다,하지만 그것은 유일한 예외입니다. 태그 안에 아무 것도 없다면, 그것은 '문자열'이라는 것을 압니다. 내가 필요로하는 것은'Nothing'의'tn.Tag' 값을'Nothing'의'String' 값으로 변환시킬만큼 똑똑한'DirectCast (tn.Tag, String) '와 같은 메소드입니다. – Odinsonnah

+0

@Odinsonnah 당신은 단지'DirectCast' 전에 널 검사를하거나,'DirectCast' 대신에'CType' 또는'CStr'을 사용할 수 있습니다. –

+0

코드를 테스트 한 결과 DirectCast가 실제로 태그가 아무것도없는 경우에도 제대로 작동한다는 것을 알 수 있습니다. 따라서 이것이 나를위한 완벽한 해결책입니다. – Odinsonnah

0

완전히 합법적이다 : 당신이 CStr 구문 상관하지 않는 경우, 당신도 DirectCast 또는 CType 대신 사용할 수 있습니다

DoTagStringStuff(CStr(tn.Tag)) 

. CStr은 기본적으로 CType(x, String)의 약어입니다. CStr은 VB6에 있었지만 사용 하기엔 시대에 뒤 떨어진 것으로 간주되지 않습니다. 여전히 핵심 VB.NET 언어의 기능으로 간주됩니다.

기술적으로, 당신이 속성은 String 객체를 참조하는 것을 알고 있기 때문에, 최선의 선택은 실제로 DirectCast 다음과 같습니다 당신이 취할 값의 변환을하지 않을 때

DoTagStringStuff(DirectCast(tn.Tag, String)) 

DirectCast이 약간 더 효율적입니다 장소. 부수적 인 이점으로, 더 많은 자체 문서화가 가능합니다.해당 행을 읽는 사람은 String 객체에 대한 참조 인 Tag을 알게되며 CStr 또는 ToString을 사용하면 명확하지 않습니다.

관련 문제