在C#中别名多个类

时间:2015-08-07 08:34:11

标签: c# templates alias

我想(我想)让我的代码更具可读性。我一直在使用以下类别别。

using Histogram = EmpiricScore<int>;
using FeatureHistogram = Dictionary<string, EmpiricScore<int>>;

但我认为(注意:我试图用FeatureHistogram来描述Histogram,而不是EmpiricScore<int>>):

using Histogram = EmpiricScore<int>;
using FeatureHistogram = Dictionary<string, Histogram>;

似乎更具可读性(依赖关系可以更深入,如果我创建一个Hierarchical特征直方图怎么办),并且更容易重新分解(如果我碰巧决定名称Histogram是不幸的)。但编译器不会这样做。为什么?有什么方法可以绕过这个吗?

创建新类似乎有点矫枉过正......

2 个答案:

答案 0 :(得分:3)

  

创建新类似乎有点矫枉过正......

我认为这不是一种矫枉过正,因为如果你设计一个包装Dictionary<string, Histogram>的类(你的类应该实现IDictionary<string, Histogram>并且拥有支持数据的私有Dictionary<string, Histogram>属性)你“重新实施可重用性,这是面向对象编程的最佳卖点之一。

例如,您的实现将如下所示:

public class FeatureHistorgram : IDictionary<string, Historam>
{
    private readonly Dictionary<string, Histogram> _data = new Dictionary<string, Histogram>();

    public void Add(string key, Histogram value)
    {
        _data.Add(key, value);
    }

    // ... and the rest of IDictionary<TKey, TValue> interface members...
}

答案 1 :(得分:3)

但编译器不会这样做。为什么?

编译器不会根据C#规范9.4.1:

执行此操作

using-alias-directive引入一个标识符,作为直接封闭的编译单元或命名空间体内的命名空间或类型的别名。

using-alias-directive:
using   identifier   =   namespace-or-type-name   ;
  

using-alias-directives的写入顺序没有意义,namespace-or-type-name引用的using-alias-directive的解析不受using-alias-directive本身或其他using-directives的影响立即包含编译单元或命名空间体中的{1}}。

     

换句话说,namespace-or-type-name的{​​{1}}被解析为好像直接包含的编译单元或命名空间体没有使用指令。

using-alias-directive

选项: 1.在评论中建议namespace N1.N2 {} namespace N3 { using R2 = N1; // OK using R3 = N1.N2; // OK using R4 = R2.N2; // Error, R2 unknown } ,定义新的命名空间

demo

M.kazem Akhgary
  1. 为更深层次的依赖关系创建类