Библиотека объектов - значение индекса доступа или сам объект?(например, глубокая или мелкая копия возможно?) - PullRequest
0 голосов
/ 03 июля 2010

Я всегда был сбит с толку / не уверен насчет того, как .Net копирует ссылки.Допустим, у меня есть объект Bitmap для GDI +.

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

'Foo' содержит объект Bitmap.Теперь допустим, что я делаю это.

dim bar as bitmap = foo

Это мелкая копия или глубокая копия?Если я установил foo равным ничего, то внезапно ли bar также ссылается на «ничто»?Или bar также содержит копию растрового изображения, и для того, чтобы полностью удалить растровое изображение из памяти, мне нужно установить ни 'foo', ни 'bar' в ничто?

Мне нужно сохранить библиотекурастровых изображений в памяти, и для меня было бы проще просто сохранить ссылку на каждое растровое изображение в каждом созданном объекте как переменную, вместо того, чтобы кодировать его с индексом и ссылаться на библиотеку каждый раз, когда это необходимо (например,'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

1 Ответ

0 голосов
/ 03 июля 2010

В общем, ссылки на объекты просто копируют ссылку.Это не относится к типам, которые наследуются от 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)

Если я установил foo на Ничто, то я просто сделал ссылку на что-то другое (Ничего) и не изменил объект, на который bar ссылается.

Если вы храните списокхранение объектов в структуре списка кажется наиболее разумным.Однако, если вы знаете, что у вас когда-либо будет фиксированное небольшое количество объектов, возможно, использование ссылок в качестве полей класса является приемлемым вариантом.В вашем случае вы абстрагируете доступ с помощью метода getImage, который является хорошим выбором для дизайна, так как тогда пользователям вашего класса не нужно будет беспокоиться, зная вашу стратегию отслеживания ссылок, и вы сможете изменить ее какНужно без разбивки объектов, которые зависят от вашего класса.

...