2013-06-24 30 views
2

我有一個樹視圖,其中一些treenodes有一個字符串保存到他們的標記對象,並且一些標記保留爲空。後來我想在某些地方使用這些字符串作爲它們存在的節點。選項嚴格和拆箱對象到字符串

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對象的字符串有點困惑。

錯誤彈出窗口建議使用CStr,但我的印象是CStr函數僅在VB.net中作爲VB6的返回,並且實際上不應該用於新代碼。如果我在上面的代碼中嘗試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返回的Tag屬性。通常情況下,通過將模型與視圖分離來避免其使用。 –

+0

「標籤」出現在大多數(如果不是全部的話)控件上。我沒有看到在某些情況下使用這個問題。我不知道TS的情況,但它本身不是倒退;)。 – Styxxy

回答

0

我對如何最好地解開treenode.tag對象的字符串有點困惑。

首先,這裏沒有涉及拳擊或拆箱。由於String是一類,所以Object變量可以直接持有對沒有裝箱的String的引用。在Object變量中存儲值類型(Structure)時發生拳擊。

話雖這麼說 - 要提取的價值,因爲你知道你總是存儲String,您可以使用DirectCast拉出值:

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 

如果其他類型的可能被存儲在Tag,或者Tag可能留空,那麼other conversions可能是合適的。

+0

這就是問題所在,有時標籤會保留爲「Nothing」,但這是唯一的例外。如果標籤中有任何東西,我知道它是一個'String'。我認爲我可能需要的是像'DirectCast(tn.Tag,String)'這樣的方法,它足夠聰明,可以將'Nothing'的'tn.Tag'值轉換爲'Nothing'的'String'值。 – Odinsonnah

+0

@Odinsonnah在這種情況下,您可以在「DirectCast」之前放置空檢查,或者使用「CType」或「CStr」而不是「DirectCast」。 –

+0

我測試了代碼,事實證明,即使標籤沒有任何內容,DirectCast實際上也能正常工作,所以這對我來說是一個完整的解決方案。 – Odinsonnah

0

使用CStr投/轉換爲標籤的字符串是完全合法的:

DoTagStringStuff(CStr(tn.Tag)) 

如果你不關心CStr語法,您可以使用DirectCastCType,來代替。 CStr基本上只是CType(x, String)的簡寫。雖然在VB6中確實存在CStr,但使用它並不過時。它仍然被認爲是核心VB.NET語言的一個功能。

從技術上講,因爲你知道屬性引用String對象,最好的選擇實際上是DirectCast

DoTagStringStuff(DirectCast(tn.Tag, String)) 

DirectCast會更有效,當你不打算數值的任何轉換採取地點。作爲一個好處,它更自我記錄。任何閱讀該行的人都會知道Tag是對String對象的引用,而如果您使用的是CStrToString,那就不明顯了。