使用属性引用字典中键/值对的最佳方法
这是一件微不足道的事情,但是我很好奇听到人们对此的看法。
如果我有一个可通过属性访问的字典,那么我们希望该属性使用哪种格式?
/// <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()]块时,它开始变得有点拥挤了。
那么,我们更喜欢哪个?为什么?有人有更好的主意吗?
解决方案
回答
我喜欢第二个纯粹是因为避免在代码中使用魔术字符串/数字是一件好事。 IMO如果我们需要多次在代码中引用数字或者字符串文字,则它应该是一个常量。在大多数情况下,即使只使用一次,它也应该保持不变
回答
我同意@Glenn的观点纯属挑剔。答案是对我们有用的。所有这些代码都在10行中进行(如果我们包括省略的最后一个花括号)。没有人会迷路,有被误入歧途的机会非常渺茫(不是不可能,但非常渺茫)。另一方面,如果我们在其他地方使用了键,则一定要使用常量。
就我个人而言,我会对你的花括号风格感到厌恶。 :) 只是在开玩笑!这真的是风格问题。
回答
这没有回答问题,但是我认为" DefaultValue"并不意味着我们认为的含义。它没有为媒体资源设置默认值。
有关更多详细信息,请参见MSDN和此问题。
回答
很多人可能会认为第二种选择是"正确的",因为多次使用的任何值都应重构为常数。我很可能会使用第一个选项。通过将字典条目封装在强类型属性中,我们已经接近"代码完成"解决方案。这样可以减少在实现中加紧检索错误的Dictionary条目的机会。
在getter和setter中,只有两个地方可以打乱键入" myKey",这很容易发现。
第二种选择会太混乱。
回答
我们可以将属性名称与键进行匹配,并使用反射来获取查找的名称。
public string FirstProperty { get { return Dictionary[PropertyName()]; } set { Dictionary[PropertyName()] = value; } private string PropertyName() { return new StackFrame(1).GetMethod().Name.Substring(4); }
这具有使所有属性实现相同的另一个好处,因此,我们可以根据需要在Visual Studio中将它们设置为代码段。
回答
当我们像在我们一样只在一个上下文中使用魔术字符串时,我认为这没关系。
但是,如果我们需要在该类的另一部分中使用密钥,请使用const。
回答
@Joel我们不想依靠StackFrame。内联可能会破坏我们最不希望的一天。
但要问的是:这两种方法实际上并没有多大关系。