这是一个相当微不足道的事情,但我很想听听别人的意见。
如果我有一个我可以通过属性访问的词典,那么您更喜欢这些格式中的哪一种?
/// <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()]块时,它会开始变得有点拥挤。
那么你更喜欢哪个,为什么?有没有人有更好的想法?
答案 0 :(得分:4)
我非常喜欢第二个,因为在代码中避免使用魔术字符串/数字是一件好事。 IMO如果你需要多次引用代码中的数字或字符串文字,它应该是一个常量。在大多数情况下,即使它只使用一次它应该是一个常数
答案 1 :(得分:1)
我同意@Glenn纯粹的挑剔观点。答案是适合你的。所有这些代码都在10行中进行(如果包含省略的最后一个大括号)。没有人会迷路,而且输入错误的机会相当渺茫(并非不可能,但非常渺茫)。另一方面,如果您在其他地方使用了密钥,那么请务必使用常量。
就个人而言,我会谈谈你的大括号风格。 :) 开玩笑!这真的是一种风格问题。
答案 2 :(得分:0)
这不是回答你的问题,但我不认为“DefaultValue”意味着你的意思。它没有为您的属性设置默认值。
有关详细信息,请参阅MSDN和this 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会在你最不期望的时候破坏你的一天。
但问题是:无论哪种方式都不重要。