[英]Option Strict On disallows implicit conversions between String and Object {String}
[英]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
語法,則可以使用DirectCast
或CType
。 CStr
本質上只是CType(x, String)
簡寫。 盡管CStr
在VB6中確實存在,但使用它並不認為已過時。 它仍然被認為是核心VB.NET語言的功能。
從技術上講,由於您知道該屬性引用了String
對象,因此最佳選擇實際上是DirectCast
:
DoTagStringStuff(DirectCast(tn.Tag, String))
當您不打算進行任何值的轉換時, DirectCast
效率會稍高一些。 附帶的好處是,它具有更多的自我記錄功能。 讀過該行的任何人都將知道Tag
是對String
對象的引用,而如果使用CStr
或ToString
,則不會很明顯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.