簡體   English   中英

選項嚴格並將對象裝箱到字符串

[英]Option Strict and Unboxing Object to String

我有一個treeview,其中一些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

除非我不再檢查空字符串或僅空白字符串。

我對如何最好地從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可能留空,則其他轉換可能是合適的。

使用CStr將標記CStr轉換/轉換為字符串是完全合法的:

DoTagStringStuff(CStr(tn.Tag))

如果您不關心CStr語法,則可以使用DirectCastCType CStr本質上只是CType(x, String)簡寫。 盡管CStr在VB6中確實存在,但使用它並不認為已過時。 它仍然被認為是核心VB.NET語言的功能。

從技術上講,由於您知道該屬性引用了String對象,因此最佳選擇實際上是DirectCast

DoTagStringStuff(DirectCast(tn.Tag, String))

當您不打算進行任何值的轉換時, DirectCast效率會稍高一些。 附帶的好處是,它具有更多的自我記錄功能。 讀過該行的任何人都將知道Tag是對String對象的引用,而如果使用CStrToString ,則不會很明顯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM