3

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

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

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

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

4

7 回答 7

4

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

于 2008-09-04T16:18:09.977 回答
1

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

就个人而言,我会对你的花括号风格提出异议。:) 只是在开玩笑!这真的是风格问题。

于 2008-09-04T16:25:32.330 回答
0

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

有关更多详细信息,请参阅MSDN这个问题

于 2008-09-04T16:29:42.100 回答
0

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

第二种选择会变得太混乱。

于 2008-09-04T16:31:39.850 回答
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 中将它们设置为代码片段。

于 2008-09-04T16:35:58.763 回答
0

当您只在一种情况下使用魔术字符串时,就像您一样,我认为没关系。
但是,如果您需要在课堂的另一部分使用密钥,请转到const.

于 2008-09-04T16:38:25.543 回答
0

@Joel,您不想指望 StackFrame。 当你最不期待的时候,排队可能会毁了你的一天。

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

于 2008-09-04T17:25:36.867 回答