2009-07-15 6 views
2

나는이 바보 같은 질문 경우 죄송하지만 저를 듣고 : 위의 코드 샘플에서C# .NET에서 StringDictionary에 대한 복사 생성자가없는 이유는 무엇입니까?

Dictionary<string, string> genericDict = new Dictionary<string, string>; 
genericDict.Add("blah", "bloop"); 
// Use the copy constructor to create a copy of this dictionary 
return new Dictionary<string, string>(genericDict); 

, 나는 일반적인 사전의 복사본을 만들 수 있습니다.

이제 System.Collections.Specialized.StringDictionary를 사용한다고 가정합니다. 왜냐하면 모든 유형의 "문자열"유형을 입력하지 않기 때문입니다. StringDictionary에는 복사 생성자가 없습니다! 사실 기본 생성자 만 있습니다.

물론, 나는 StringDictionary를 반복 수동으로 각 키/값 쌍을 추가,하지만 난

왜 복사 생성자를 - P 싶지 않아 할 수 있습니까? 내가 여기서 뭔가를 놓치고 있니?

답변

9

StringDictionary 유형은 오히려 더 이상 사용되지 않습니다. 제 생각에는 Dictionary<String,String>이 여기에서 사용하기를 원하는 것입니다.

Dictionary<TKey,TValue> 유형은 StringDictionary 유형보다 더 유용한 일부 강력한 유형 인터페이스 (ICollection<KeyValuePair<TKey, TValue>>IEnumerable<KeyValuePair<TKey, TValue>>)를 구현합니다.

StringDictionary 유형 입니다. 강하게 입력 된 경우 나만 게으 르기 위해 사용하지 않을 것입니다.

public static StringDictionary NewCopy(this StringDictionary olddict) 
{ 
    var newdict = new StringDictionary(); 
    foreach (string key in olddict.Keys) 
    { 
     newdict.Add(key, olddict[key]); 
    } 
    return newdict; 
} 

이 그럼 당신은이 작업을 수행 할 수 있습니다 :

StringDictionary newdict = olddict.NewCopy(); 
+0

그래, 그렇긴하지만 전문 Dictionary 가 아니라 특수 StringDictionary가 아닌가? 왜 나는 매우 편리한 과부하가 특수 StringDictionary에 구현되지 않았는지 궁금합니다. – Pandincus

+2

제 생각에는 그는 제네릭 타입이 이런 종류의 생성자를 가지고 있다고 말하는 것 같지만 오래된 전문 사전은 그렇지 않습니다. – Keltex

+0

@Pandincus : Keltex는 정확합니다. 특수 형식 사전은 오버로드 된 생성자가 아니며 이전 형식이기 때문에 복사 생성자가 그 당시 고려되지 않았을 가능성이 큽니다. 그럼에도 불구하고'Dictionary '을 사용하고'StringDictionary'를 포기하는 것이 좋습니다. –

5

, 당신은 확장 메서드를 만들 수 있습니다 (아마도 레거시 응용 프로그램을 지원하는) "문자열"유형을 입력하고 싶지는 않지만 Dictionary<string,string>이 만족 스럽다면 Dictionary<string,string> 하위 클래스 인 새 클래스를 만들고 모든 메소드를 재정의하지 마십시오. 다른 네임 스페이스에있는 한 StringDictionary이라고 부를 수도 있습니다.

1

당신이 정말 StringDictionary를 사용하려면

2

동의에 동의합니다. Dictionary<string, string>을 사용하는 것이 더 낫습니다. 당신은 일반적인 유형의 모든 시간을 입력 좋아하지 않는 경우에, 당신은 당신의 자신의 서브 클래스를 만들 수 있습니다

public class StringDict : Dictionary<string, string> 
{ 
    // duplicate all Dictionary's constructors here, calling the base constructor for each. 
} 

잇 짜잔를!Dictionary 문자열을 사용할 때마다 StringDict을 대신 사용하십시오.

+1

나는 StrigDict가 더 강력한 기능을 제공한다고 생각한다. – quillbreaker

+0

오, 너! 오타가 수정되었습니다. – Randolpho

+1

별칭을 사용할 수 있습니다. – Marlon