C# C语言中的多类别名#

C# C语言中的多类别名#,c#,templates,alias,C#,Templates,Alias,我想(正在尝试)使我的代码更具可读性。我一直在使用下面的类别名 using Histogram = EmpiricScore<int>; using FeatureHistogram = Dictionary<string, EmpiricScore<int>>; 看起来更具可读性(依赖关系可以更深入,如果我创建一个分层特征直方图会怎么样),并且更容易重新考虑(如果我碰巧认为名称直方图是不幸的)。但是编译器不会这么做。为什么?有什么办法可以避免这种情况吗 创

我想(正在尝试)使我的代码更具可读性。我一直在使用下面的类别名

using Histogram = EmpiricScore<int>;
using FeatureHistogram = Dictionary<string, EmpiricScore<int>>;
看起来更具可读性(依赖关系可以更深入,如果我创建一个分层特征直方图会怎么样),并且更容易重新考虑(如果我碰巧认为名称直方图是不幸的)。但是编译器不会这么做。为什么?有什么办法可以避免这种情况吗

创建新类似乎有点过分了

创建新类似乎有点过分了

我认为这并不过分,因为如果你设计一个类来包装
字典(你的类应该实现
IDictionary
,并且有一个私有的
字典
属性来支持数据),你就在强化可重用性,这是面向对象编程的最佳卖点之一

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

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...
}
公共类功能HistoryGram:IDictionary
{
专用只读词典_data=new Dictionary();
公共空白添加(字符串键、直方图值)
{
_数据。添加(键、值);
}
//…以及其余的IDictionary接口成员。。。
}

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

编译器不会根据C#规范9.4.1执行此操作:

使用别名指令
引入一个标识符,该标识符用作直接封闭的编译单元或命名空间主体内的命名空间或类型的别名

using-alias-directive:
using   identifier   =   namespace-or-type-name   ;
使用别名指令编写
的顺序没有意义,而
使用别名指令
引用的
命名空间或类型名称
的解析不受
使用别名指令
本身或直接包含编译单元或命名空间体中的其他
使用指令
的影响

换句话说,解析
using alias指令的
名称空间或类型名
,就好像直接包含编译单元或名称空间主体没有using指令一样

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

使用直方图=System.Collections.Generic.List;
名称空间测试
{
使用FeatureHistogram=System.Collections.Generic.Dictionary;
公共课程
{    
公共静态void Main()
{
var x=新直方图();
Console.WriteLine(x.GetType());
var y=新特征直方图();
Console.WriteLine(y.GetType());
}   
}
}
  • 为更深层次的依赖关系创建类

  • @米奇·邓肯。谢谢,但是我在这篇文章里找不到我的答案。我的问题是关于“堆叠”别名的,如果您使用直方图=EmpiricScore进行
    名称空间之外,然后使用FeatureHistogram=字典
    内部命名空间是可能的。但这并不能回答更深层次的依赖关系。啊,我并没有注意到这一点,请忽略这个问题:实现
    IDictionary
    还是从
    字典
    继承更好?如果没有阅读您的答案,我会使用后者(并避免使用
    \u data
    ,而是使用
    base
    。@XavierPeña好吧,这取决于具体情况。如果您想自定义如何将项添加到基础字典中,接口方法是正确的。如果您不打算在向字典添加项之前/之后执行某项操作,则派生
    字典
    就足够了…”“如果您想自定义如何将项添加到基础字典中,接口方法是正确的”:那么在
    字典
    继承中重写
    添加
    有哪些缺点?(当我试图阐述这个问题时,我意识到要让自己听起来不那么聪明有多难,所以……根本不是我的本意,只是想学习一下)@XavierPeña你应该看看这些文件
    Add
    不是一个虚拟方法:它不是一个过度使用的问题,重要的是,当声明一个新类时,它将不再与原始的、冗长的类名(而不仅仅是别名)在双边赋值上兼容。
    using-alias-directive:
    using   identifier   =   namespace-or-type-name   ;
    
    namespace N1.N2 {}
    namespace N3
    {
        using R2 = N1;          // OK
        using R3 = N1.N2;       // OK
        using R4 = R2.N2;       // Error, R2 unknown
    }
    
    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());
            }   
        }
    }