2010-07-02 6 views
0

.Net은 항상 혼동 스럽거나 .Net이 참조를 복사하는 방법에 대해 확신하지 못했습니다. GDI + 용 Bitmap 개체가 있다고 가정 해 보겠습니다.개체 라이브러리 - 색인 값 또는 개체 자체에 액세스 하시겠습니까? (예 : 심도 대 얕은 복사)

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

'Foo'는 비트 맵 객체를 보유합니다. 이제 내가 이렇게한다고 가정 해 보겠습니다.

dim bar as bitmap = foo 

얕은 사본입니까, 아니면 깊은 사본입니까? foo를 아무 것도 아닌 것으로 설정하면 막대가 갑자기 '아무것도'를 참조하지 않습니까? 아니면 막대가 비트 맵의 ​​복사본을 포함하고, 비트 맵을 메모리에서 완전히 제거하기 위해서 '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 

답변

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의 자손 : 나는 아무것도에 foo을 설정하면

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) 

, 나는 그냥 뭔가 다른 (아무것도)에 기준점을 만들었 및 bar가 언급 한 대상을 변경하지 않았습니다.

개체 목록을 저장하는 경우 개체를 목록 구조에 저장하는 것이 가장 현명한 방법입니다. 그러나 고정 된 소수의 개체 만 가질 것이라는 것을 안다면 클래스의 필드로 참조를 유지하는 것이 실용적인 옵션입니다. 귀하의 경우에는 getImage 메서드를 통해 액세스가 추상화됩니다.이 클래스는 사용자가 참조를 추적하는 전략을 모르는 것이 아니기 때문에 좋은 디자인을 선택하는 것이므로 필요할 때마다 변경할 수 있습니다. 클래스에 의존하는 깨는 오브젝트.

+0

이제 알았습니다. foo를 아무것도 설정하지 않으면 객체를 참조하는 것이 아니라 파기합니다. 그러나 Foo.Dispose()와 같은 참조를 통해 개체에 대한 작업을 수행하면 개체를 제외하고 해당 개체를 가리키는 변수는 삭제되지 않습니다. 어쨌든 내 머리 속에 의미가 있습니다. 고맙습니다! –