0

我一直对 .Net 如何复制引用感到困惑/不确定。假设我有一个 GDI+ 的位图对象。

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

'Foo' 保存位图对象。现在假设我这样做。

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
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)

如果我设置foo为 Nothing,那么我只是将引用指向其他东西(Nothing)并且没有更改bar引用的对象。

如果要存储对象列表,将它们存储在列表结构中似乎是最谨慎的。但是,如果您知道您只会拥有固定的少量对象,那么将引用保留为类的字段可能是一个可行的选择。在您的情况下,您通过方法抽象访问,getImage这是一个很好的设计选择,因为那时您的类的用户不必费心知道您跟踪引用的策略,并且您应该能够根据需要更改它而不会破坏取决于您的班级的对象。

于 2010-07-02T22:02:22.983 回答