2

リスト、キュー、スタックなどを初期化する場合、どの方法が優先されますか?

Dim q as Queue(Of Integer) = New Queue(Of Integer)

また

Dim q as New Queue(Of Integer)

また、文字列変数と整数変数に New を使い始めました - これはばかげていますか? 変数をデフォルト設定に設定するだけでなく、New を使用することに不利な点はありますか? 例えば

Dim Num1 As New Integer
Dim Str1 As New String("")
Dim Bool1 As New Boolean

ありがとうございました!

4

1 に答える 1

2

プログラマーに、プログラムを書くときにタイプするのが好きか、少ないかを尋ねたら、通常の答えは「少ない!」です。バグが多いか少ないかを尋ねると、通常の答えは「少ない!」です。これらは相反する目標です。

As New 構文は、非常に長い間 VB.NET の一部でした。ただし、文字列が添付されています。新しいオブジェクトを作成する必要があるかどうかは、ランタイムに完全に任せます。それはバグジェネレーターになる傾向があります。変数が既に割り当てられていても、本当に新しいオブジェクトを作成したい場合があります。また、このスニペットでは、かなりあいまいです。たとえば、次のようになります。

For ix As Integer = 0 To 42
   Dim q As New Queue(Of Integer)
   '' etc...
Next

問題は、ループの最初のパスで作成されたキューのインスタンスを1 つ取得するか、それとも 43 個取得するかです。プログラマーは実際に何を意図していたのでしょうか。構文からはあまり明確ではありません。

あなたが見落とした 3 番目の選択肢と、私が好む選択肢があります。「型推論」と呼ばれる VB9 (別名 VS2008) 以降で利用できます。変数の型を指定せず、コンパイラーに任せて解決する場合。このオプションはOption Infer Onでオンにする必要があり、デフォルトでオンになっています。As New の省略構文の利点を組み合わせ、さらに New ステートメントを使用してコード内でオブジェクトを明示的に作成できます。

Option Infer On
...
For ix As Integer = 0 To 42
   Dim q = New Queue(Of Integer)
   '' etc...
Next

ここで、q はコンパイラによって Queue 型であると推測され、コードがキューの 43 個のインスタンスを生成することは明らかです。C# 言語でこれに相当するのはvarキーワードです。

于 2013-06-02T14:29:15.430 に答える