在C#Dictionary中为Key和Value命名,以提高代码的可读性

时间:2015-05-28 03:21:49

标签: c# generics dictionary

在C#struct中,我们可以通过它的名称清楚地知道变量的用途。例如,

public struct Book
{
    public string title;
    public string author;
}

然后,我知道b.title是一种字符串,它指的是标题。

但是在C#字典中,我们只能指定类型

Dictionary<string,string> d

如何使代码更具可读性,使得字典的键是字符串的类型,它指的是标题,值是字符串的类型,它指的是作者?这意味着,其他人可以很容易地知道d [&#34; J.R.R。 Tolkien&#34;]在阅读代码时错误地使用了字典。

修改 @mike z建议使用变量名 titleToAuthor 来帮助提高可读性。但我真正的问题是在代码中有嵌套字典。例如。

Dictionary<string, Dictionary<string, string>>, 
or even 3 levels   
Dictionary<string, Dictionary<string , Dictionary< string , string[] >>>. 

我们希望在不创建自己的类的情况下保持使用Dictionary的便利性,但同时我们需要一些方法来提高可读性

3 个答案:

答案 0 :(得分:9)

根据@ScottDorman的建议,您可以定义一个源自TitleAuthorDictionary的新类型Dictionary<string, string>,如下所示:

public class TitleAuthorDictionary : Dictionary<string, string>
{
    public new void Add(string title, string author)
    {
        base.Add(title, author);
    }

    public new string this[string title]
    {
        get { return base[title]; }
        set { base[title] = value; }
    }
}

然后您可以使用更易读的Dictionary Collection,如下所示:

TitleAuthorDictionary dictionary = new TitleAuthorDictionary();
dictionary.Add("Title1", "Author1");
dictionary.Add(title: "Title2", author: "Author2");
dictionary["Title2"] = "Author3";

答案 1 :(得分:3)

如果不与语言作斗争,你无法解决的问题,我建议用文档解决。标识符作为自我文档的一种形式包含在该类别中。

所以要将自我文档添加到这种类型中:

using TitleToAuthor = System.Collections.Generic.Dictionary<
    string, // title
    string  // author
>;

要向该类型的实例添加自我文档:

TitleToAuthor title_to_author = new TitleToAuthor();

不幸的是你不能使用指令作为泛型类型参数进行嵌套,所以使用这样的解决方案会使你的using指令位于文件的顶部但是很难看,但是至少那些写得很脏的代码会创建一次。它左边的一个非常易读的别名(显示它的确切含义),你可以在其余的代码中引用它而不实际创建新的数据类型。

另一种方法是简单地创建新的数据类型,继承自Dictionary,例如我建议这条路线,如果你有更多你可以使用新类型,而不是简单地获得一个更可读的类型名称,如添加对该集合特别有用的方法或如果该集合用于许多源文件(从那时起你我必须经常重复使用相同的指令。

在这种情况下,组合可能比继承更好(将字典存储为成员),因为那时你可以根据自己的需要创建一个更小的子集界面(并且可能通过提供更高级别来减少滥用它的方法更少对特定容器类型完全有意义的函数),而不仅仅是一个完整的字典界面+更多方法。在这种情况下,您将把这个有点难以理解的通用通用字典变成一个隐藏的实现细节,不仅可以更好地读取其类型名称,还可以提供更小的,定制的(不太通用)界面,更具体地处理您的需求。举一个简单的例子,允许为键或值指定空字符串可能是错误的。字典不会强加这样的断言,但是您自己设计的接口使用字典作为私有实现细节。

如果你对字典的键/值参数的可读性感到沮丧,可能问题不在于字典的可读性,而在于特定字典的公开曝光量。如果您有一个字典实例,甚至是具有非常公开可见性的类型,并且可以在整个地方引用,那么您可能不仅关注此类代码的可读性,还关注允许访问它的人执行他们想要的任何操作的灵活性。允许使用完整的字典(包括您可能不希望在更广泛的范围内发生的事情)。毕竟,即使像float这样的类型也很少告诉你它应该做什么,但是我们倾向于以浮点数是类/函数的实现细节或函数参数/返回类型的方式编写代码就他们所做的而言,这是相当明显的。因此,或许最好不要将这些词典变得不那么明显,而是更多地转化为私有实现细节,因为实现细节的清晰度和可读性通常与接口中更公开可见的部分无关紧要。在整个代码库中访问。

答案 2 :(得分:2)

按照设计,字典是一个键值对,并且这样调用公开的集合。如果您想要更明确的内容,可以派生自己的自定义词典或在您自己的类上实现适当的词典接口。您还可以将此实现作为键控集合,在其中提供lambda表达式以从数据中派生键。