2

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

班上

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所描述的类有哪些陷阱和问题?

4

1 回答 1

4

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

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

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

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

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

就个人而言,如果我想要从字符串到字符串的映射,我会使用Dictionary<string, string>. 每个称职的 C# 开发人员都会立即知道这意味着什么,在调试方面没有任何“奇怪”,没有额外的分配等。

于 2013-09-16T18:39:36.457 回答