0

.Net が参照をコピーする方法について、私は常に混乱/不確かでした。GDI+ 用の Bitmap オブジェクトがあるとします。

dim foo as new bitmap("c:\foo.bmp")

「Foo」はビットマップ オブジェクトを保持します。今、私がこれをするとしましょう。

dim bar as bitmap = foo

これは浅いコピーですか、それとも深いコピーですか? foo を何も設定しない場合、bar も突然「何もない」を参照しますか? または、バーにはビットマップのコピーも含まれていますか?ビットマップをメモリから完全に削除するには、「foo」と「バー」の両方を何も設定する必要がありますか?

ビットマップのライブラリをメモリに保持する必要があります。インデックスを使用してコーディングし、毎回ライブラリを参照するよりも、作成された各オブジェクトの各ビットマップへの参照を変数として格納する方が簡単です。必要です (「BitmapLibrary.Singleton.getBitmap(id)」など)

一言で言えば、私はこれを行うことができます:

struct graphic object
    dim myBitmap as bitmap

    sub draw(g as graphics)
          g.drawimage(myBitmap)
    end sub

これの代わりに:

struct graphic object
    dim myBitmapIndex as integer

    sub draw(g as graphics)
          g.drawimage(bitmaplibrary.getImage(myBitmapIndex))
    end sub
4

1 に答える 1

0

一般に、オブジェクトへの参照は参照をコピーするだけです。これは、コピーされる System.ValueType から継承する型には当てはまりません。

例えば:

Dim foo as new Bitmap("C:\foo.bmp")
Dim bar as Bitmap = foo

''//Now close foo
foo.Dispose()
''//Access to bar fails, since the object it was pointing to was the same as foo
Console.WriteLine(bar.PixelHeight)

System.ValueType の子孫の場合:

Dim p1 as new Point(1, 2)
Dim p2 as Point = p1

p1.Offset(1, 0)

Console.WriteLine(p1)  ''//Prints (2, 2)
Console.WriteLine(p2)  ''//Prints (1, 2)

Nothingに設定fooした場合、参照ポイントを別のもの (Nothing) に設定しただけで、参照するオブジェクトは変更されていませんbar

オブジェクトのリストを保存する場合は、それらをリスト構造に保存するのが最も賢明です。ただし、固定された少数のオブジェクトしか持たないことがわかっている場合は、おそらく参照をクラスのフィールドとして保持することが実行可能なオプションです。あなたの場合、getImage良い設計上の選択であるメソッドを介してアクセスを抽象化します。これは、クラスのユーザーが参照を追跡するための戦略をわざわざ知る必要がなく、壊れることなく必要に応じて変更できるはずだからです。クラスに依存するオブジェクト。

于 2010-07-02T22:02:22.983 に答える