在C#中嵌套'使用'等同于typedef

时间:2013-09-02 10:00:32

标签: c# coding-style nested typedef using

我有一个类来处理配置文件,我想整理代码以使其更具可读性和可维护性。在C ++中,我通常会使用typedef来执行此操作,但我发现有一种方法可以使用'using'关键字在C#中执行此操作(请参阅Equivalent of typedef in C#)。我唯一的问题是似乎没有办法嵌套这些。这就是我想要实现的目标:

using ConfigValue = System.Collections.Generic.List< System.String >;
using ConfigKey = System.String;
using ConfigSection = System.Collections.Generic.Dictionary< ConfigKey, ConfigValue >;

如果我更改ConfigKey或ConfigValue的类型并忘记更改ConfigSection,我怎样才能在不显示ConfigSection的情况下实现此目的?

由于

阿伦

2 个答案:

答案 0 :(得分:3)

不幸的是,你无法做到这一点。 C / C ++中typedef的主要C#替代方法通常是类型推断,例如使用var关键字,但在许多情况下仍然需要输入通用定义。几乎所有C#程序员都使用Visual Studio或其他IDE来保存他们在许多情况下输入所有内容的原因。

我不太推荐使用“using-as-typedef”模式,因为我希望它对大多数C#程序员来说都是不熟悉和令人惊讶的。此外,我认为你必须在每个文件中包含“psuedo-typedef”这一事实大大降低了它的实用性。

你可以考虑做的一件事当然是从你想要输入的东西中取出实际的类,例如像这样:

public class ConfigValue : List<string>
{
}

public class ConfigKey
{
    private string s;

    public ConfigKey(string s)
    {
        this.s = s;
    }

    // The implicit operators will allow you to write stuff like:
    // ConfigKey c = "test";
    // string s = c;

    public static implicit operator string(ConfigKey c)
    {
        return c.s;
    }

    public static implicit operator ConfigKey(string s)
    {
        return new ConfigKey(s);
    }
}

public class ConfigSection : Dictionary<ConfigKey, ConfigValue>
{
}

但这当然是矫枉过正,除非你还有其他理由想要制作具体的课程。

答案 1 :(得分:0)

您不能,using x = y不应该用于创建类型别名。 它应该用于创建命名空间别名,以解决冲突(例如,命名空间和共享相同名称的类)。