【问题标题】:In C# .NET, is there a reason for no copy constructor for StringDictionary?在 C# .NET 中,是否有没有 StringDictionary 的复制构造函数的原因?
【发布时间】:2009-07-15 15:05:02
【问题描述】:

如果这是一个愚蠢的问题,我深表歉意,但请听我说完:

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

为什么没有复制构造函数?我在这里遗漏了什么吗?

【问题讨论】:

    标签: c# .net collections dictionary stringdictionary


    【解决方案1】:

    StringDictionary 类型已经过时了。我认为Dictionary&lt;String,String&gt; 是你想在这里使用的。

    Dictionary&lt;TKey,TValue&gt; 类型实现了一些强类型接口(@98​​7654324@ 和 IEnumerable&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;),这使得它比 StringDictionary 类型更有用。

    虽然StringDictionary 类型强类型,但我不建议仅出于懒惰而使用它。

    【讨论】:

    • 是的,但这不是针对通用 Dictionary,而不是针对专用 StringDictionary 吗?我只是想知道为什么没有为专门的 StringDictionary 实现非常方便的重载。
    • 我认为他是说泛型类型确实有这种构造函数,但旧的专用字典没有。
    • @Pandincus:Keltex 是正确的 - 专用字典没有重载构造函数,因为它是一种较旧的类型,并且很可能当时没有考虑复制构造函数。无论如何,我强烈建议您使用Dictionary&lt;String,String&gt; 并放弃StringDictionary
    • 我猜懒惰只会让你走这么远。好吧,你说服了我。 :-D
    【解决方案2】:

    如果你真的想使用 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();
    

    【讨论】:

      【解决方案3】:

      我同意这个共识——你最好使用Dictionary&lt;string, string&gt;。但如果你不喜欢一直输入泛型类型,你可以创建自己的子类:

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

      Et Voila! 每当您想使用字符串 Dictionary 时,请改用 StringDict

      【讨论】:

      • 我认为 StrigDict 提供了更引人注目的功能集。
      【解决方案4】:

      如果您不想在任何地方键入“字符串”类型,但又对Dictionary&lt;string,string&gt; 感到满意,那么创建一个新类来继承Dictionary&lt;string,string&gt;,并且不要覆盖任何方法。您甚至可以将其称为 StringDictionary,只要它位于不同的命名空间中即可。

      【讨论】:

        猜你喜欢
        • 2014-02-05
        • 2021-02-20
        • 2013-12-26
        • 2011-07-15
        • 2014-04-15
        • 2019-06-20
        • 2015-07-24
        • 2019-08-08
        • 1970-01-01
        相关资源
        最近更新 更多