0

場合によっては、インターフェースを実装するか、基本メソッドがオブジェクトを期待する仮想 (MustInherit) を継承する必要がありますが、たとえば、渡す値は常に整数になることがわかっています。

以下の例から最高のパフォーマンスを得るにはどうすればよいですか:

Public Sub DoSomething(ByVal obj As Object)
    'option 1:
    Dim x As Integer = obj

    'option 2:
    Dim y = DirectCast(obj, Integer)
End Function

考慮事項:

  • オプション 1: キャストはありませんが、適切ではない可能性があります。パフォーマンスのコストは低くなりますか?
  • オプション 2: 型がわかっている場合にキャストしますが、より安全だと感じます。

注:「なぜ別の方法で実装したくないのか」などとコメントしないでください。私の質問はこれを行う方法ではありません。質問する方法の例が見つかりませんでした、私の質問どのオプションが正しいか、そして何がより多くのパフォーマンスを犠牲にするかです。

4

2 に答える 2

2

最初のオプションで行っていることは、暗黙のキャストです。コンパイラは明示的なキャストを作成するため、実際に得られるのは次のようなものです。

Dim x As Integer = DirectCast(obj, Integer)

厳密モードがオフの場合、Object から Integer への暗黙的なキャストのみを行うことができます。厳密モードをオンにして、誤って暗黙のキャストを行わないようにする必要があります。厳密モードをオンにすると、コードをコンパイルするために明示的なキャストを行う必要があります。

于 2009-12-12T23:46:01.563 に答える
1

オプション 1まだキャスト中です。実際には、それ以上のことを行っており、変換を実行しています。たとえば、obj が文字列「1」の場合、オプション 1 はそれを整数 1 に変換しますが、オプション 2 は InvalidCastException で失敗します。(古き良き時代、これは「悪の型の強制」として知られていました。これは、暗黙の変換よりもクールに聞こえますが、このアプローチがエラーを偽装し、予期しない動作を引き起こす可能性があるという潜在的な危険性も強調しています。)

したがって、オプション 1 は、もう少し多くの作業を行っているため、パフォーマンスがわずかに低下する可能性があります (単純な古いキャストとは対照的に変換)。ただし、整数のみを渡す場合、違いは重要ではない可能性があります。いつものように、パフォーマンスが本当に重要な場合は、 を測定してください。

おそらくパフォーマンスよりも重要な考慮事項は、望ましい動作です。たとえば、誰かが文字列 "1" を渡した場合、整数 1 を渡したように動作させたいですか? その場合は、オプション 1 に進みます。この場合に失敗したい場合は、オプション 2 に進みます。

于 2009-12-12T23:46:22.840 に答える