2

一部のツリーノードの文字列がタグオブジェクトに保存され、一部のタグが何も残されていないツリービューがあります。後で、文字列が存在するノードで、文字列を何かに使用したいと思います。

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

コードを同僚のプロジェクトと互換性を持たせるためにオプション strict をオンにする必要があるまで、これはうまくいきました。treenode.tag オブジェクトから文字列を最適にアンボックスする方法について少し混乱しています。

エラーポップアップは の使用を示唆していますが、関数は VB6 への逆戻りとして VB.net にのみ存在し、実際には新しいコードに使用すべきではないCStrという印象を受けました。CStr上記のコードを試してみるとtn.Tag.toString、実行時に計算に失敗したときにエラーが発生しますNothing.toString

これを修正する正しい方法は何ですか? そもそもタグオブジェクトを使用して文字列値を保持する必要がありますか、またはこれに使用できるボックス化解除を必要としないより良いツリーノードプロパティがありますか?

編集:おそらくこれは正しいと思いますか?

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

空文字列または空白文字列のみをチェックしていないことを除いて。

4

2 に答える 2

0

treenode.tag オブジェクトから文字列を最適にアンボックスする方法について少し混乱しています。

まず、ここにはボックス化やボックス化解除はありません。Stringはクラスであるため、変数はボックス化せずObjectに a への参照を直接保持できます。変数内に値の型 ( )Stringを格納すると、ボックス化が発生します。StructureObject

そうは言っても - 値を抽出するには、常に を格納していることを知っているので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が空のままになる可能性がある場合は、他の変換 が適切である可能性があります。

于 2013-06-24T17:14:44.900 に答える
0

タグを文字列にキャスト/変換するために使用CStrすることは完全に正当です。

DoTagStringStuff(CStr(tn.Tag))

CStr構文が気にならない場合は、代わりに DirectCastまたはを使用できます。は基本的に の省略形です。VB6 には存在していましたが、それを使用するのは時代遅れとは見なされません。これは、依然としてコア VB.NET 言語の機能と見なされています。CTypeCStrCType(x, String)CStr

技術的には、プロパティがStringオブジェクトを参照することがわかっているため、実際には次のように選択するのが最適DirectCastです。

DoTagStringStuff(DirectCast(tn.Tag, String))

DirectCast値の変換を行わない場合は、わずかに効率的です。副次的な利点として、より自己文書化されます。その行を読んだ人は誰でも、がオブジェクトTagへの参照であることを知っていますが、 orを使用した場合、それは明らかではありません。StringCStrToString

于 2013-06-24T17:17:21.123 に答える