使用属性引用字典中的键值对的最佳方法

时间:2008-09-04 16:15:14

标签: .net dictionary properties constants

这是一个相当微不足道的事情,但我很想听听别人的意见。

如果我有一个我可以通过属性访问的词典,那么您更喜欢这些格式中的哪一种?

/// <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()]块时,它会开始变得有点拥挤。

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

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

我同意@Glenn纯粹的挑剔观点。答案是适合你的。所有这些代码都在10行中进行(如果包含省略的最后一个大括号)。没有人会迷路,而且输入错误的机会相当渺茫(并非不可能,但非常渺茫)。另一方面,如果您在其他地方使用了密钥,那么请务必使用常量。

就个人而言,我会谈谈你的大括号风格。 :) 开玩笑!这真的是一种风格问题。

答案 2 :(得分:0)

这不是回答你的问题,但我不认为“DefaultValue”意味着你的意思。它没有为您的属性设置默认值。

有关详细信息,请参阅MSDNthis question

答案 3 :(得分:0)

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

第二种选择会变得太乱。

答案 4 :(得分:0)

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

public string FirstProperty {
get {
    return Dictionary[PropertyName()];
}
set {
    Dictionary[PropertyName()] = value;
}

private string PropertyName()
{
    return new StackFrame(1).GetMethod().Name.Substring(4);
}

这样做的另一个好处是可以使所有属性实现完全相同,因此如果需要,可以将它们设置为visual studio中的代码片段。

答案 5 :(得分:0)

当你只在一个环境中使用魔法字符串时,就像你一样,我认为没关系 但如果您需要在课程的其他部分使用该密钥,请转到const

答案 6 :(得分:0)

@Joel你不想指望StackFrame。 In-lining会在你最不期望的时候破坏你的一天。

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