【问题标题】:Best way to use a property to reference a Key-Value pair in a dictionary [closed]使用属性在字典中引用键值对的最佳方法 [关闭]
【发布时间】:2010-09-07 19:55:18
【问题描述】:

这是一件相当琐碎的事情,但我很想听听人们对此的看法。

如果我有一个可以通过属性访问的字典,您希望该属性使用哪种格式?

/// <summary>
/// This class's FirstProperty property
/// </summary>
[DefaultValue("myValue")]
public string FirstProperty {
    get {
        return Dictionary["myKey"];
    }
    set {
        Dictionary["myKey"] = value;
    }

这可能是典型的做法。它相当高效,易于理解等。唯一的缺点是使用更长或更复杂的键可能会拼错或仅更改一个实例或其他内容,这导致我这样做:

/// <summary>
/// This class's SecondProperty property
/// </summary>
[DefaultValue("myValue")]
private const string DICT_MYKEY = "myKey"
public string SecondProperty {
    get {
        return Dictionary[DICT_MYKEY];
    }
    set {
        Dictionary[DICT_MYKEY] = value;
    }

这稍微复杂一些,但似乎提供了额外的安全性,并且更接近我所认为的“代码完整”解决方案。不利的一面是,当您在属性上方还有一个 /// 块和一个 [DefaultValue()] 块时,那里开始变得有点拥挤。

那么你更喜欢哪个,为什么?有人有更好的想法吗?

【问题讨论】:

    标签: .net dictionary properties constants


    【解决方案1】:

    @Joel 你不想指望 StackFrame。 In-lining 会在你最意想不到的时候毁掉你的一天。

    但问题是:无论哪种方式都不是很重要。

    【讨论】:

      【解决方案2】:

      您可以将属性名称与键匹配,并使用反射来获取查找名称。

      public string FirstProperty {
      get {
          return Dictionary[PropertyName()];
      }
      set {
          Dictionary[PropertyName()] = value;
      }
      
      private string PropertyName()
      {
          return new StackFrame(1).GetMethod().Name.Substring(4);
      }
      

      这具有使所有属性实现相同的额外好处,因此您可以根据需要在 Visual Studio 中将它们设置为代码 sn-ps。

      【讨论】:

        【解决方案3】:

        当你像你一样只在一个上下文中使用魔法字符串时,我认为没关系。
        但是,如果您需要在课堂的其他部分使用密钥,请转到 const

        【讨论】:

          【解决方案4】:

          很多人可能会争辩说第二个选项是“正确的”,因为任何多次使用的值都应该重构为常量。我很可能会使用第一个选项。通过将字典条目封装在强类型属性中,您已经接近“代码完成”解决方案。这减少了在您的实现中搞砸检索错误字典条目的机会。 在 getter 和 setter 中,只有 2 个地方可能会弄乱键入“myKey”,这很容易发现。

          第二个选项太混乱了。

          【讨论】:

            【解决方案5】:

            这不是在回答您的问题,但我认为“DefaultValue”并不是您认为的意思。它不会为您的属性设置默认值。

            请参阅MSDNthis question 了解更多详情。

            【讨论】:

              【解决方案6】:

              我同意@Glenn 的纯粹挑剔观点。答案是对你有用的任何东西。所有这些代码都发生在 10 行中(如果包含省略的最后一个花括号)。没有人会迷路,而且输入错误的可能性非常小(并非不可能,但非常小)。另一方面,如果您在其他地方使用了密钥,那么一定要使用常量。

              就我个人而言,我会对你的花括号风格不屑一顾。 :) 开玩笑!这确实是风格问题。

              【讨论】:

                【解决方案7】:

                我喜欢第二个纯粹是因为在代码中避免使用魔术字符串/数字是一件好事。 IMO 如果您需要在代码中多次引用数字或字符串文字,它应该是一个常量。在大多数情况下,即使它只使用一次,它也应该是一个常量

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-04-19
                  • 2019-04-21
                  • 1970-01-01
                  • 2017-03-11
                  • 2011-09-23
                  相关资源
                  最近更新 更多