在C#中键入别名

时间:2013-09-16 18:25:38

标签: c# .net overloading typedef implicit-conversion

我正在寻找将语法糖添加到项目中的方法,我正在考虑添加一个Alias类,这有点让人联想到C ++中的typedef,并且存在显着差异。它的目的是提供一种方法,可以轻松地为复杂的类型名创建缩短的别名,并允许方法重载更灵活。它看起来像这样:

班级

public class Alias<T>
{
    private T Data { get; set; }

    public static implicit operator T(Alias<T> rhs)
    {
        return rhs.Data;
    }

    public static implicit operator Alias<T>(T rhs)
    {
        return new Alias<T> { Data = rhs };
    }

    // Dereferencing operator
    public static T operator ~(Alias<T> rhs)
    {
        return rhs.Data;
    }
}

用例1:缩短复杂类型名称

// Declare alias somewhere for a cumbersome type, 
// like a dictionary of dictionaries
class UserFields : Alias<Dictionary<string, string>> {}
class UserInfos : Alias<Dictionary<int, UserFields>> {}

// Now use it
UserFields fields = new UserFields();
UserInfos infos = new UserInfos();
(~infos)[0] = fields;

用例2:方法重载

// Declare some aliases
class UserId : Alias<Int64> {}
class ProductId : Alias<Int64> {}

// Now we can distinguish between them, though they
// are both Int64's
public void DoSomething(UserId userId) { ... }
public void DoSomething(ProductId productId) { ... }

<小时/> 这些例子是人为的,但希望能说明我的意图。我担心这可能最终会变成黑客,带来意想不到的后果。如上所述使用Alias类有哪些陷阱和问题?

1 个答案:

答案 0 :(得分:4)

关于为什么这是一个坏主意:

  • 它不是真正的别名。任何不允许您使用隐式转换的地方都无法愉快地使用它。
  • 您使用的是class,这意味着每次使用时都需要分配一个额外的对象。使用struct
  • 会更干净
  • 由于没有特别明显的原因,你正在超载~运算符 - 当然也不是类似于C#中运算符的正常含义的方式
  • 你正在以一种真正 与专业化无关的方式使用子类化

您可以考虑使用using指令作为别名:

using FooString = System.String;
...
FooString x = "whatever";

...缺点是此处的“别名”仅适用于同一来源。

就个人而言,如果我想要从字符串到字符串的映射,我只使用Dictionary<string, string>。每个C#开发人员都值得他们的盐立即知道它的意思,在调试方面没有什么“奇怪”,没有额外的分配等。