質問

コーディングベンチャーでC ++とVB.NETの間を移行しています...これは、VB.NETで値または参照によって何かがいつ発生するかについて、時々混乱を招きます。

たとえば、多数のオブジェクトが入力されたMyObjectの配列があるとしましょう。

dim MyArr(5000) of MyObject

ここで、この配列からの情報がさまざまなデータ構造全体に移動するとします。

dim MyList as new List(of MyObject)
for i as integer = 0 to 5000 step 1000
  Mylist.add(MyArr(i))
next

then

dim MyTable as new HashTable
dim i as integer = 0
for each O as MyObject in Mylist
  if i mod 2 = 0 then
     MyTable.add(O.ToString(), O)
  end if
next

上記のシナリオでは、すべてが参照によるものだと思います。 " MyTable"からエントリを抽出した場合MyObjectメンバーを変更すると、MyArrのオリジナルが変更されると思います。

しかし、私は何かが参照によるものであり、価値によるものだと思った状況に遭遇しました。

アイテムは常に参照によってコンテナに追加されますか、それとも値によって追加されることがありますか

混乱しています。

役に立ちましたか?

解決

「参照による」ケースではありません。または「値による」本当に。 Addメソッドに渡す値がコピーされます。ただし、参照タイプの場合、その値はオブジェクトへの参照です。オブジェクトへの他の参照を介してそのオブジェクトを操作すると、オブジェクトに到達したときにそれらの変更を確認できます。

データ自体の独立したコピーが表示された場合は、値タイプを使用していることを示唆していますが、変更を行っている場合は、 mutable 値型。これは悪い考えです。ほとんどの場合、値の型は不変である必要があります。そうでない場合、多くの混乱が生じます。 (参照型も不変である可能性があります-文字列が良い例です。)

参照タイプと値タイプの詳細については、参照の記事をご覧ください。およびパラメーター。 C#の観点から書かれていますが、基本はVBにも当てはまります。

値型の値と参照の違いを理解したら、コレクションがより意味をなさないと思います。

他のヒント

このルールを使用できます。オブジェクトにnullを割り当てることができる場合、参照によって渡されます。それ以外の場合は、値で渡されます。

この規則の例外は、Nullable型と構造体です。それらは常に値で渡されます。

アイテムの種類に依存すると思います。コレクションにはありません。

例:

int [] ints = new int [10];

ints [0] = 1; //-)

この場合、ValueTypeである限り1がコピーされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top