2011-01-29 17 views
1

더 좋은 제목이 있으면 알려주십시오. 메서드 참조 매개 변수로 참조 매개 변수

나는 이것 때문에 대신 DisposeHelper을했다 :

private Something _thing; 

void Dispose() 
{ 
    DiposeHelper.Dipose(ref _thing); 
} 

을하지만 분명히 내가 참고로 DisposeHelper.Dispose는 IDisposable을 공급 할 수 없습니다

private Something _thing; 

void Dispose() 
{ 
    if(_thing != null) 
    { 
     _thing.Dispose(); 
     _thing = null; 
    } 
} 

... 내가이 작업을 수행 할 수 , 내가 그렇게 좋아는 IDisposable로 뭔가를 캐스팅하지 않는 :

private Something _thing; 

void Dispose() 
{ 
    IDisposable d = _thing; 
    DiposeHelper.Dipose(ref d); 
} 

... 그 다음 NUL하지 않는 것을 의미하는 원래 필드를 lify.

다음은 좀 더 추상적 인 예입니다. DoThis는 작동하지 않으며, DoThat은 다음을 수행하지 않습니다.

public class Test 
{ 
    public Test() 
    { 
     Something o = new Something(); 

     DoThis(o); 

     DoThat(ref o); 
    } 

    private void DoThis(IFoo obj) { } 

    private void DoThat(ref IFoo obj) { } 
} 

public class Something : IFoo { } 

public interface IFoo { } 

왜 내가 할 수 없습니까?

답변

2

나는 당신이 할 수없는 이유에 대한 기술적 이유를 모른다.

그러나 이것은 작동합니다 refout 표현에 대한 매개 변수 유형이 정확히 일치해야하기 때문에 그것은 작동하지 않습니다

var o = new Something(); 
DoThat(ref o); 

private void DoThat<T>(ref T obj) where T : class, IFoo { 
    obj = null; 
} 
2

. DoThat 실제로이 구현이 있다면 상상 :

private void DoThat(ref IFoo obj) 
{ 
    obj = new SomeOtherImplementationOfFoo(); 
} 

를 이제이 코드를 :

Something o = new Something(); 
DoThat(ref o); 

SomeOtherImplementationOfFoo 대신 Something의 예를 참조 o로 끝날 것이다 - 분명히 잘 될 수 없습니다.

그렇기 때문에 ref은 작동 방식과 같습니다. Rob의 대답은이 문제를 해결할 수있는 방법입니다.

0

형식이 속성의 정확한 형식이어야하기 때문에 작동하지 않습니다.

DerivedBase으로 전달할 수 있다고 가정 해보십시오. 이제이 함수는 Base이지만 Derived이 아닌 새 객체에 매개 변수를 할당합니다. Booom

private Derived d; 

void Modify(ref Base b) 
{ 
    b=new Base(); 
} 

Modify(ref d);//Booom 

해결 방법은 Rob의 대답과 같이 일반적인 매개 변수를 사용하고 있습니다.

public static void DisposeAndNull<T>(ref T x) 
    where T:IDisposable 
{ 
    x.Dispose(); 
    x=null; 
} 
관련 문제