2009-06-15 4 views
4

: 그것은 정적이기 때문에IDisposable을 구현하는 정적 속성을 어떻게 올바르게 사용합니까? 예를 들어

using (Brushes.Black) 
{ 
... 
} 

은 좋은 생각이 아니다. 다음에 앱이 Brushes.Black을 사용하게되면 문제가 발생합니다.

이제 Brushes.Black 만 사용하는 경우 관리되지 않는 리소스 (잘하면!) 만 남겨두기 때문에 처분하지 않는 것이 좋습니다.

그러나 일반적으로 정적 IDisposables를 많이 사용하지 않도록해야합니까? 아니면 누락 된 것이 있습니까?

답변

3

일반적으로 그냥 사용하고 프레임 워크 클래스에서 처리하는 것을 걱정하게합니다.

매번 생성 및 폐기하지 않고 사용할 수 있도록 작성되었습니다. 각각은 처음 사용할 때 만들어지며 해시 테이블에 캐시됩니다. 프레임 워크 클래스는 응용 프로그램을 닫을 때 제대로 처리 할 책임이 있습니다.

정말 걱정할 필요가있는 정적 IDisposables가별로 없습니다. 만약 당신이 굉장히 많은 브러쉬를 사용한다면 아마 어쨌든 루프의 색상으로 브러시를 생성 할 것입니다. 그리고 나서 브러시를 폐기해야 할 책임이 있습니다. 예를 들어

+0

. 일반적으로 사람들은 항상 IDisposable 객체를 폐기하는 것에 대해 매우 강하게 느낍니다. 그러나 정적 IDisposables의 경우, 줄 바꿈은 "해당 항목을 처리하지 말고 많은 항목을 사용하지 않아야합니다"라고 생각합니다. – mbeckish

+1

자신이 소유 한 개체를 처리해야하지만 Brushes 클래스는 Brush 인스턴스를 소유하므로 해당 개체를 삭제할 수 없습니다. 그렇게하면 Brushes 클래스에 사용할 수없는 객체에 대한 참조가 포함됩니다. – Guffa

2

: 그것은 정적 때문에

사용 (Brushes.Black) {...}

은 좋은 생각이 아니다. 다음 번에 앱이 으로 Brushes.Black을 사용하면 이 처리되었으므로 문제가 발생합니다.

정적 필드가 아닙니다. 필요할 때 새 인스턴스를 만들기 위해 속성이 코드를 능동적으로 실행합니다. 그냥 해당 코드 (반사판) 볼 : 나는 당신이에 대한 의견을하지 않았다 놀랐어요

public static Brush Black 
{ 
    get 
    { 
     Brush brush = (Brush) SafeNativeMethods.Gdip.ThreadData[BlackKey]; 
     if (brush == null) 
     { 
      brush = new SolidBrush(Color.Black); 
      SafeNativeMethods.Gdip.ThreadData[BlackKey] = brush; 
     } 
     return brush; 
    } 
} 
+0

저는 실제로 (Brushes.Black) {...}을 사용하여 문제가 발생했습니다. 단단한 루프에있을 때 - 아마 null로 설정되지 않았을 수 있습니까? – mbeckish

+0

일회용 물건은 소유자가 처분해야합니다. 리플렉터의이 코드는 발신자가 소유자임을 보여줍니다. –

+0

@wcoenen - 개체의 로컬 인스턴스에 대해 이야기 할 때는 동의합니다. 그러나 정적이기 때문에 나중에 언제든지 앱에서 코드를 안전하게 사용해야 사용할 수 있습니다. 리플렉터 (Reflector)에 따르면 브러시가 null 인 경우 새 브러쉬를 만들기 때문에이 경우에는 문제가되지 않습니다. 그러나이 답변의 첫 번째 주석에서 언급했듯이 적어도 "using"문을 사용하고 명시 적으로 null로 설정하지 않으면 항상 작동하는 것은 아닙니다. – mbeckish