2

我有一个类来处理配置文件,我想整理代码以使其更具可读性和可维护性。在 C++ 中,我通常会使用 typedefs 来执行此操作,但我发现在 C# 中可以使用 'using' 关键字来执行此操作(请参阅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 的情况下实现这一点?

谢谢

艾伦

4

2 回答 2

3

不幸的是,你不能这样做。C/C++ 中 typedef 的主要 C# 替代方法通常是type inference,例如使用var关键字,但在许多情况下您仍然必须键入通用定义。几乎所有 C# 程序员都使用 Visual Studio 或其他 IDE 是有原因的,这使他们在许多情况下免于输入所有内容。

我不会过多推荐“using-as-typedef”模式,因为我希望大多数 C# 程序员对它会感到陌生和惊讶。另外,我认为您必须在每个文件中都包含“psuedo-typedef”这一事实大大降低了它的实用性。

您可以考虑做的一件事当然是用您想要 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>
{
}

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

于 2013-09-02T10:23:44.917 回答
-1

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

于 2013-09-02T10:26:02.360 回答