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

问题描述:

这是一件相当平凡的事情,但我很好奇听到人们对它的意见。使用属性在字典中引用键值对的最佳方式

如果我有一个词典,我可以通过属性进行访问,那么您会选择哪种格式?

/// <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行(如果包含省略的最后一个大括号)。没有人会迷路,迷路的机会非常渺茫(并非不可能,但非常渺茫)。另一方面,如果你在别的地方使用了密钥,那么DEFINATELY就是按照这个常数去做的。

就我个人而言,我会在你身上花费你的花括号风格。 :) 开玩笑!这确实是一个风格问题。

这不是回答你的问题,但我不认为“DefaultValue”意味着你的想法。它不会为您的媒体资源设置默认值。

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

很多人可能会争辩说第二个选项是“正确的”,因为任何超过一次的值都应该被重构为常量。我很可能会使用第一个选项。通过将字典条目封装在强类型属性中,您已经接近“代码完整”解决方案。这样可以减少在实现中检索错误的词典条目的机会。 只有两个地方你可以在吸气和吸气器中输入“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。当你最不期待的时候,In-lining会毁了你的一天。

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