我正在寻找将语法糖添加到项目中的方法,我正在考虑添加一个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;
}
}
// 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;
// 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
类有哪些陷阱和问题?
答案 0 :(得分:4)
关于为什么这是一个坏主意:
class
,这意味着每次使用时都需要分配一个额外的对象。使用struct
~
运算符 - 当然也不是类似于C#中运算符的正常含义的方式您可以考虑使用using
指令作为别名:
using FooString = System.String;
...
FooString x = "whatever";
...缺点是此处的“别名”仅适用于同一来源。
就个人而言,如果我想要从字符串到字符串的映射,我只使用Dictionary<string, string>
。每个C#开发人员都值得他们的盐立即知道它的意思,在调试方面没有什么“奇怪”,没有额外的分配等。