2014-07-25 11 views
0

내가일회용 만들기 다른 클래스는

public class Connection : IDisposable { ... } 

처분 할 수있는 연결 클래스와

public class UsesConnection : IDisposable { 
    UsesConnection (Connection c) {...} 
    public void Dispose() { 
    c.Dispose(); 
    ... 
    } 
    ... 
} 

는 어떻게 만듭니 까 그것은에 대한 종속성이있는 클래스를 가지고 있고 UsesConnection 클래스를 돌려 사용 CA2000 에러가 발생하지 않으십니까?

다음 코드는 c = new Connection();

Connection c = null; 
UsesConnection u = null; 
try { 
    c = new Connection() 
    u = new UsesConnection(c); 
    return u; 
} catch { 
    if (u != null) u.Dispose(); 
    else if (c != null) c.Dispose(); 
    throw; 
} 
+1

정말로 연결 하시겠습니까? Connection은 UsesConnection 외부에서 생성되었지만 함께 폐기 되었습니까? 나는 소유권을 잘 정의했다. A는 객체를 생성하며 객체를 처리 할 책임이 있습니다. –

+0

"[CA2000의 MSDN 설명서] (http://msdn.microsoft.com/en-us/library/ms182289.aspx),"경고를 표시하지 않을시기 "절을 읽는 것이 좋습니다. *"경고를 표시하지 마십시오 ** 당신이 ** Close와 같은 Dispose를 호출하는 객체에 ** 메소드를 호출하지 않은 경우 ** 경고를 발생시키는 메소드가 IDisposable 객체가 객체 **를 래핑하는 경우 ** ** 명시 적으로 사건이 발생합니다 그 경고를 무시하거나 억제 할 수있는 곳으로 언급했는데 ... – elgonzo

답변

2

대신 using 블록을 사용하여 라인에 CA2000 오류를 가져옵니다.

using (var c = new Connection()) 
using (var u = new UsesConnection(c)) 
{ 
    // Do your work here 
} 

그렇지만 return으로 두 개체를 처리하지 마십시오. UsesConnectionConnection을 처리하지 마십시오.

일부 발신자가 아닌 일회용 참조의 수명주기를 관리해야합니다. "내 물건을 처분하지 않으면 어떻게됩니까?"

+2

하지만 그는 그가 'u'를 돌려주고있어 이것이 작동하지 않을 것이라고 생각하니? – DavidG

+0

더 자세히 살펴보면이 점에 동의합니다. 'UsesConnection'은 전달 된'Connection' 인스턴스를 "소유"하지 않으므로 처리를해서는 안됩니다. 코드 분석에서이를 받아들이 기 위해서는 여전히 억압이 올바른 대답 일지 모르지만 이전 대답에서 언급 한 이유는 아닙니다. – vcsjones

+0

당신이 말한 것의 의미를 생각한 후에 당신이 2 가지 중 하나를 제안했다는 것을 알았습니다 : 1) 필요할 때마다 연결을 만들어 나중에 (값 비싼) 처분하거나, 2) 연결을 "더 높게" 호출 스택 및 연결이 더 오래 살았습니다. 어느 것을 추천 하시겠습니까? – Jonny