【问题标题】:VS 2008 Intellisense for C# static dictionaries用于 C# 静态字典的 VS 2008 Intellisense
【发布时间】:2009-07-08 16:55:05
【问题描述】:

我在 C# 类中有以下内容:

public static readonly SortedDictionary<string, string> Fields =
    new SortedDictionary<string, string>
        { ... }

我希望有一种方法可以让 Intellisense 为 Fields 中定义的所有键提供提示。它提供了类中的方法和属性的列表,包括Fields 属性,但是当我访问Fields[Fields[" 时,它只说我需要提供一个字符串键。有没有办法让它告诉我字符串键的列表,因为这是一个静态类属性,在编译后根本不是动态的或更改的?

【问题讨论】:

  • 这是一件很奇怪的事情。如果您的键是静态的,请为它们创建一组常量并使用这些常量,而不是一直编写字符串文字。
  • IDE 应该如何知道这个属性根本不是动态的并且在编译后没有改变?

标签: c# visual-studio-2008 dictionary intellisense


【解决方案1】:

如果键是静态的,使用枚举而不是字符串作为键不是更好吗?

通过枚举,您的编译器可以告诉您选项是什么,但您不能用字符串来做到这一点。

【讨论】:

    【解决方案2】:

    改为这样做:

    public enum MyKeys
    {
       Key1,
       Key2,
       Key3
    }
    
    public static readonly SortedDictionary<MyKeys, string> Fields =
        new SortedDictionary<MyKeys, string>
            { ... }
    

    这将导致智能感知获取枚举类型,因此您将获得所需的效果。

    【讨论】:

      【解决方案3】:

      在我看来,您认为readonly 意味着字典永远不会改变。情况并非如此 - 它仅意味着该字段的值(它是对字典的引用)不会改变(即使这样它仍然可以在构造函数中改变,并且在它执行之前可以为 null)。字典本身是非常可变的。

      【讨论】:

        【解决方案4】:

        您最好的方法可能是创建public static readonly 字段或属性。

        如果您需要类似字典的行为,您应该按照其他人的建议将键设为枚举。

        请记住,所有字典类都是可变的,这意味着其他代码可以在您的字典中添加或删除项目。防止这种情况的唯一方法是在 KeyedCollection 周围继承 ReadOnlyCollection 并公开索引器。

        【讨论】:

        • 是的,它会的。 IntelliSense 自动完成枚举键
        【解决方案5】:

        我使用静态属性来做到这一点。

        为了获得 Intellisense,我为我的设置类所做的是创建一个创建静态属性的代码 sn-p。设置了代码 sn-p,以便我输入设置的名称,并且在属性名称和查找名称中都使用相同的名称。

        像这样:

         <Code Language="CSharp" Kind="method decl">
            <![CDATA[     public static string $name$
            {
                get { return GetSetting("$name$", $default$); }
                set { SaveSetting("$name$", value); }
            }
            ]]>
         </Code>
        

        GetSetting 方法会做这样的事情:

         private static string GetSetting(string name)
         {
              if (!_Fields.ContainsKey(name))
                  _Fields.Add(name, default);
              return _Fields[name];
         }
        

        这使得添加静态属性并仍然获得 Intellisense 变得非常容易。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-25
          • 1970-01-01
          • 2013-02-10
          相关资源
          最近更新 更多