繁体   English   中英

在C#中别名多个类

[英]Aliasing multiple classes in C#

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

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

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

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

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

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

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

我觉得它不是一种矫枉过正,因为如果你设计一个包装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...
}

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

根据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立即包含编译单元或命名空间体中的using-directives

换句话说, using-alias-directivenamespace-or-type-name被解析为好像直接包含编译单元或命名空间体没有using-directives。

namespace N1.N2 {}
namespace N3
{
    using R2 = N1;          // OK
    using R3 = N1.N2;       // OK
    using R4 = R2.N2;       // Error, R2 unknown
}

选项:1。如M.kazem Akhgary在评论中建议的那样,定义新的命名空间

演示

using Histogram = System.Collections.Generic.List<int>;

namespace TEST
{
    using FeatureHistogram = System.Collections.Generic.Dictionary<string, Histogram>;

    public class Program
    {    
        public static void Main()
        {
            var x = new Histogram();
            Console.WriteLine(x.GetType());

            var y = new FeatureHistogram();
            Console.WriteLine(y.GetType());
        }   
    }
}
  1. 为更深层次的依赖创建类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM