【问题标题】:Using Directive to declare a pseudo-type in C#在 C# 中使用 Directive 声明伪类型
【发布时间】:2011-12-08 17:17:42
【问题描述】:

我继承了一些我刚刚开始挖掘的源代码,我发现以前的所有者已经使用了using 指令作为List<T> 的别名,但我从未见过这个特定的之前接近。

namespace MyNamespace
{
    using pType1 = List<type1>;
    using pType2 = List<List<type1>>;

     // classes here
}

这两个元素在代码中被大量使用,并且也是代码中几个关键方法的返回类型。我得到了他试图通过使用简单名称而不是一遍又一遍地重复 List&lt;type1&gt;List&lt;List&lt;type1&gt;&gt; 来完成的任务。我正在争论是否创建一个真正的类型来替换 using 语句,但在我花时间之前,我想知道是否有任何优点/缺点来保持当前的实现。

【问题讨论】:

  • 这些用法确实很少见。在代码库中,作者通常试图隐藏他们对泛型有用处的缺乏理解。我见过List&lt;Dictionary&lt;List&lt;type1&gt;, IEnumerable&lt;Foo&gt;&gt;&gt; 之类的东西 :-) 即使你给这只野兽起个名字,它仍然是一只野兽。

标签: c# .net c#-4.0 using using-directives


【解决方案1】:

一般来说,如果一个数据结构代表应用程序域模型中的某个实体,它应该有自己的类型;它使代码更加清晰易懂。另一方面,如果您只需要一个 List&lt;List&lt;string&gt;&gt; 来进行中间数据处理,那么为此创建合适的类型并没有真正的好处。

在您的情况下,由于原始开发人员遇到了为该类型创建别名的麻烦,因此它会被大量使用是合乎逻辑的,这指向“表示实体”场景。如果是这样,一定要继续为结构创建一个新类型(可能比裸列表更合适,通常是根据接口而不是具体类定义的东西,但这取决于你在那里实际建模的内容)。

【讨论】:

  • 谢谢乔恩......你的回答是我保持当前结构的“最佳”骗局。我将实现我自己的类型。谢谢大家
【解决方案2】:

如果该构造如您所说的那样被大量使用,我肯定会用(该)真实类型替换它(明确写出 List 或创建一个新类型)。如果有人碰巧更改了其中一个类型声明,比如

using pType1 = List<type2WhichType1InheritsFrom>;

因为他认为基础版本在不查看所有使用它的地方的情况下做得更好,所以可能会有一些不想要的副作用。

【讨论】:

  • 在实践中同意你的观点,但理论上如果遵守 Liskov 的替换应该不会引起问题
  • 随着作者的变化,有关具体实现细节的知识消失了。说到这里,我总是尽量让我的代码可维护。我们有一些项目的原作者离开了公司,给了我们一些非常有趣的代码结构,只是为了确保修改一行会破坏整个应用程序......我讨厌实践与理论:-)
  • @DanielElliott 这不是朝另一个方向发展吗?如果我有一个 List,我只能将它更改为 List,如果没有将非字符串对象添加到列表中的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多