首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#字典中给键和值命名以提高代码的可读性

在C#字典中给键和值命名以提高代码的可读性
EN

Stack Overflow用户
提问于 2015-05-28 03:21:49
回答 4查看 15.5K关注 0票数 23

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

代码语言:javascript
复制
public struct Book
{
    public string title;
    public string author;
}

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

然而,在C#字典中,我们只能指定类型

代码语言:javascript
复制
Dictionary<string,string> d

如何使代码更易读,以便字典的键是字符串的类型,它指的是标题,值是字符串的类型,而它指的是author?这意味着,其他人可以很容易地知道,d"J.R.R. Tolkien“是一种错误的使用字典时,阅读代码。

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

代码语言:javascript
复制
Dictionary<string, Dictionary<string, string>>, 
or even 3 levels   
Dictionary<string, Dictionary<string , Dictionary< string , string[] >>>. 

我们希望在不创建我们自己的类的情况下继续方便地使用字典,但同时我们需要一些方法来提高可读性

EN

回答 4

Stack Overflow用户

发布于 2015-05-28 03:51:17

正如@ScottDorman所建议的,您可以定义一个从Dictionary<string, string>派生的新类型Dictionary<string, string>,如下所示:

代码语言:javascript
复制
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; }
    }
}

然后,您可以使用更具可读性的字典集合,如下所示:

代码语言:javascript
复制
TitleAuthorDictionary dictionary = new TitleAuthorDictionary();
dictionary.Add("Title1", "Author1");
dictionary.Add(title: "Title2", author: "Author2");
dictionary["Title2"] = "Author3";
票数 20
EN

Stack Overflow用户

发布于 2021-12-06 16:54:43

使用.NET 6和C# 10,您现在可以使用global using指令在项目中提供类型别名。

给内置类型他们的别名在一个地方,例如GlobalUsings.cs

代码语言:javascript
复制
global using Title = System.String;
global using Author = System.String;

然后在字典中使用别名以提高可读性。

代码语言:javascript
复制
Dictionary<string, Dictionary<Title, Author>>
票数 13
EN

Stack Overflow用户

发布于 2015-05-28 09:05:25

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

因此,要将自文档添加到这类类型中:

代码语言:javascript
复制
using TitleToAuthor = System.Collections.Generic.Dictionary<
    string, // title
    string  // author
>;

若要向该类型的实例添加自文档,请执行以下操作:

代码语言:javascript
复制
TitleToAuthor title_to_author = new TitleToAuthor();

不幸的是,您不能将使用指令嵌套为泛型类型参数,因此使用这样的解决方案将使您使用的指令位于文件的顶部--丑陋,但至少编写一次这种代码时,它的左侧将创建一个非常可读的别名(显示它的确切用途),您可以在整个代码的其余部分引用该别名,而不需要实际创建新的数据类型。

另一种方法是简单地创建新的数据类型,继承字典,例如,如果您可以使用新类型做更多的事情,比如添加对该集合特别有用的方法,或者在许多源文件中使用该集合(从那时起,您将不得不使用大量指令重复相同的方法),我建议这样做。

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

如果您被字典的键/值参数的可读性绊倒了,那么问题可能不在于字典的可读性,而在于特定字典公开的程度。如果您有一个具有非常公开的可见性的字典实例或类型,并且在整个地方都会被引用,那么您可能不仅关心这些代码的可读性,而且还关心允许访问这些代码的人做他们想做的任何事情,这在一个完整的字典中是允许的(包括您可能不希望在更广泛的范围内发生的事情)。毕竟,即使是像float这样的类型也很少告诉您它应该做什么,但是我们倾向于以这样一种方式编写代码,即浮点数是类/函数的实现细节,或者只是函数参数/返回类型,这些参数/返回类型在它们所做的事情上是非常明显的。因此,也许更好的做法是减少此类字典的可见性,并将其更多地转化为私有实现细节,因为实现细节的清晰性和可读性通常与将在整个代码库中访问的接口中更加公开可见的部分几乎没有关系。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30496657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档