字典 - 为驱动添加注释以提高 Intellisense

6
有没有一种方法可以添加注释来记录字典或ConcurrentDictionary中键/值的含义?
例如:
Dictionary<guid, string> _users;

这个例子有一个用户字典。GUID是用户ID,字符串是用户名,但除了“知道”之外很难确定。
是否有一种方法可以添加文档,以便在添加项目时,智能感知会向开发人员提供有关键和值的注释?
我知道我可以在其上方添加注释,并将该注释放入对象本身中,但是我正在寻找添加、删除等操作时的解决方法。

真的听起来对我来说有点过头了... - Ed S.
4个回答

4

最近在《GOOS书籍》中,我发现了有关将常见类型(如集合)封装在自己的类中的有趣想法:

尝试使用您正在处理的问题的语言,而不是 .Net 构造语言。这减少了领域和代码之间的概念差距。此外,尽量限制传递带有泛型的类型。这是一种重复。这表明存在应该从类型中提取的领域概念。

说实话,我并不是非常热衷于将常见的通用集合进行封装,但即使给类型自己的名称也可以使它更易于阅读和理解:

public class UserNameDictionary : Dictionary<int, string>
{
}

非常简单。现在最好阅读什么内容:
Dictionary<int, string> users = new Dictionary<int, string>();
UserNameDictionary users = new UserNameDictionary();

另外,您可以快速向您的类添加注释:

/// <summary>
/// Represents a dictionary of user names accessed by ids.
/// </summary>

这不会向Add(int, string)等方法添加注释,但当其他人使用此类时,他们将在UserNameDictionary的上下文中思考,而不是抽象的Dictionary<int, string>上下文。
如果您想使您的类更方便使用,可以隐藏基类方法:
public new void Add(int userId, string userName)
{
    base.Add(userId, userName);
}

对于更复杂的用例,我会选择自定义类,将工作委托给内部字典。


使用这种方法,如果您想使用Dictionary的所有(8个)构造函数,则必须重新定义它们,与Xaser的答案相反。 - SWdV

3

针对您的特定情况,简短的回答是“不能没有一堆样板代码”。

可以使用方法修饰符为类型参数提供文档说明。下面的示例将显示在Intellisense中所期望的参数含义。

/// <summary>
/// Class to contain things
/// </summary>
/// <typeparam name="T">UserID</typeparam>
/// <typeparam name="TK">UserName</typeparam>
public class MyDictionary<T,TK> : Dictionary<T,TK>

您可以使用这个方法来覆盖虚拟方法并以相同的方式记录它们。然而,Dictionary<,>基本上没有虚拟方法,因此您需要创建自己的调用,然后调用'base'。(忽略有问题的'new')。
但是在那个时候,您应该直接进行:
public class MyDictionary : Dictionary<string,string> 

并且完成它。

2
您可以创建一个子类来扩展字典,覆盖各种添加/删除方法以添加您自己的注释。另一种选择是创建自己的集合类,将内部字典包装起来并实现IDictionary(如果需要)。除此之外,我不确定Visual Studio提供了哪些功能或技巧来实现您想要的效果,但在这方面我并不是专家。

1
需要比Sergey的解决方案更少开销但达到相同效果的解决方案是:
using UserNameDictionary = Dictionary<int, string>;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接