2010-01-13 2 views
5

아래 예제에서 pen은 파기 (폐기) 될 예정입니까, 그렇지 않습니까?.NET에서 'using'을 사용합니다.

' VB' 
Public Function GetPen() As System.Drawing.Pen 
    Using pen As New System.Drawing.Pen(_Color, _Width) 
    pen.DashStyle = _DashStyle 
    Return pen 
    End Using 
End Function 

// C# 
public System.Drawing.Pen GetPen() 
{ 
    using (System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width)) 
    { 
     pen.DashStyle = _DashStyle; 
     return pen; 
    } 
} 

[EDIT]

한 더 정밀 ... 기준 또는 GetPen 하여 호출자에게 송신 펜 오브젝트 구조처럼 '복제'인가요? 나는 이것이 클래스, 알고 있지만 GDI 객체와 나는 외부 메소드가 penGetPen() 얻어 폐기 할 때 확인 ...

이 파괴 될 것이다 (배치)를 penGetPen()에서 만든 적이 무엇입니까?

+1

당신이 그것을 시도 할 때 무슨 일이 되었습니까? – Lazarus

+0

@Lazarus : 요청할 때 아직 시도하지 않았습니다. 나는 처음에 물었다 : 테스트 후 D – serhio

+0

: 유효하지 않은 (아무 것도 없음) 펜 (유효하지 않은 매개 변수 사용) 펜을 얻었습니다 ... – serhio

답변

3

예, 펜이 처리됩니다. 그것은 정말로 나쁜 생각입니다. 이미 처분 된 펜 반환!

GetPen에서 Using 문을 제거하면됩니다. using 문은 GetPen 호출자에 의해 사용되어야한다

Using pen As Pen = GetPen() 
    ''// Draw with this pen 
End Using 

또는 C#으로 :

using(Pen pen = GetPen()) 
{ 
    // Draw with this pen 
} 

[편집]

예, 참조가, 호출 방법에 반환되지 않습니다 사본. 그래서 펜을 GetPen에 처분하면 호출 메서드에서 해당 펜을 사용할 수 없습니다.

GetPen과 호출 메서드가 동일한 Pen 개체를 가리키고 있기 때문에 call 호출하는 메소드에서 Dispose.

7

예, 처리됩니다. 그런 다음 처분 된 상태로 반환하므로 아무 것도 쓸모가 없습니다. 이와 같은 팩토리 메서드를 사용하여 Pen 인스턴스를 반환하려면이 메서드 내에서 using 블록을 사용하지 않고 메서드 외부에 사용자가 직접 처리해야합니다.

+3

다음을 사용하여 계속 사용할 수 있습니다 :'(펜 p = GetAPen()) { – tster

6

펜이 반드시 가비지 수집되는 것은 아니지만 Dispose() 메소드가 호출됩니다.

1

예 처리됩니다.

1

반환이 완료되면 자동으로 처리됩니다. 사용하여 강제로 사용 Dispose() 암시 적으로

3

펜 반환 전에 처리됩니다. 반환이 완료하고 유효하지 않은 상태에서 펜 객체로 남아있을 것입니다 전에

public System.Drawing.Pen GetPen() 
{ 
    try 
    { 
     System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width); 

     pen.DashStyle = _DashStyle; 
    } 
    finally 
    { 
     pen.Dispose(); 
    } 
    return pen; 

} 
+1

당신은'System.Drawing.Pen pen'을 외쳐 보려고 소리칩니다. – serhio

+0

나는 그것에 대해 확실하지 않습니다 ... 변수의 정의는 using 문 안에 있으므로 컴파일러 구현에 따라 나는 익숙하지 않다.) 그것은 내부 또는 외부에 놓일 수있다. 나는 그것이 외부에 놓일 수있는 방법을 볼 수있다. (finally 블록에 NRE를 막는다.) – Will

0

귀하의 Pen 개체의 그것의 동등한 배치됩니다.

1

예.

발신자가 수신하기 전에 반환 된 Pen 객체는 처분됩니다.

Get() 스타일 방법에서는 개체 처분을 처리하지 않으려 고합니다.호출자가 객체의 처분을 허용하도록 후에이 처리됩니다. 호출 함수는 다음과 같을 것으로 기대합니다 :

using(Pen myPen = GetPen()) 
{ 
    // My code here. 
} 
0

예. 코드의 C# 및 VB.net 버전에서 함수가 반환되기 전에 .Dispose() 메서드가 호출됩니다. 그것은 그것을 파괴하는 것과 같은 것이 아닙니다. (객체는 여전히 존재합니다.) 그러나 모든 실제적인 목적을 위해 객체는 쓸모가 없습니다. 왜냐하면 그 객체를 재미 있고 유용하게 만든 관리되지 않는 리소스가 공개되기 때문입니다.

올바른 패턴은 다음과 같이 함수를 호출하는 함수가 단지 그것을 반환하는 것입니다 내부에는 IDisposable 자원을 구축 할 때 사용하고, 사용 선언을 사용합니다 :

public System.Drawing.Pen GetPen() 
{ 
    var pen = new System.Drawing.Pen(_Color, _Width)) 
    pen.DashStyle = _DashStyle; 
    return pen; 
} 

public void FunctionThatCallsGetPen() 
{ 
    using (System.Drawing.Pen pen = GetPen()) 
    { 
     //use pen here 
    } 
} 
0

사용은 다음과 같은 성명에 동일 약 :

시도 {

 var something = new something() ; 

}

당신은 즉시 폐기 것 객체를 반환하고 있기 때문에

마지막으로 는 {

if (something != null) 
{ something.Dispose();} 

}

1

코드는 다르게 구성 될 필요가있다.

public System.Drawing.Pen GetPen() 
{ 
    System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width) 
    { 
     DashStyle = _DashStyle; 
    } 
    return pen; 
} 

그런 다음 사용하여 전화 :

using (System.Drawing.Pen pen = GetPen()) 
{ 
    //Do stuff with your pen... 
} 
관련 문제