2011-08-01 2 views
2

이 확장 메서드를 만들었습니다.확장 메소드의 작성된 인스턴스가 null입니다.

public static void AddIfNullCreate<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value) 
{ 
    if (dictionary == null) 
    { 
     dictionary = new Dictionary<TKey, TValue>(); 
    } 

    dictionary.Add(key, value); 
} 

 public void DictionaryTest() 
    { 
     IDictionary<int, string> d = GetD(); 

     d.AddIfNullCreate(1,"ss"); 
    } 

    private IDictionary<int, string> GetD() 
    { 
     return null; 
    } 

AddIfNullCreate를 호출하면 dull이됩니다. 왜 이렇게이다 ?

답변

8

는 다른 방법과 마찬가지로, 매개 변수에 변화는 발신자의 인수을 변경하지 않습니다. The argument is passed by value, 해당 값이 참조 인 경우에도 마찬가지입니다. 나는 정말 그렇게 할 거라고 확실하지 않다, 그러나

d = d.AddIfNullCreate(1, "ss"); 

: 다음

public static IDictionary<TKey, TValue> AddIfNullCreate<TKey, TValue> 
    (this IDictionary<TKey, TValue> dictionary, TKey key, TValue value) 
{ 
    if (dictionary == null) 
    { 
     dictionary = new Dictionary<TKey, TValue>(); 
    } 

    dictionary.Add(key, value); 
    return dictionary; 
} 

:

하나의 옵션도 사전을 반환하는 것입니다. 난 그냥 조건부 방법 자체에 사전 생성 거라고 생각 : 이것은 정상적인 방법으로 수행 된 경우

public void DictionaryTest() 
{ 
    IDictionary<int, string> d = GetD() ?? new Dictionary<int, string>(); 

    d[1] = "ss"; 
} 
+0

Jon은 여기에 추가 할 항목이 없습니다. 언제나처럼 +1합니다. +1 –

3

당신이 심판 매개 변수로 사전을 통과해야하는 것을되도록 새로로 메모리 포인터 생성 된 개체가 올바르게 설정되었습니다. ref 매개 변수로 확장 메서드의 첫 번째 매개 변수를 지정할 수 있다고는 생각하지 않습니다.

관련 문제