Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套';使用';用C#表示,相当于typedef_C#_Coding Style_Nested_Typedef_Using - Fatal编程技术网

嵌套';使用';用C#表示,相当于typedef

嵌套';使用';用C#表示,相当于typedef,c#,coding-style,nested,typedef,using,C#,Coding Style,Nested,Typedef,Using,我有一个类来处理配置文件,我想整理代码,使其更具可读性和可维护性。在C++中,我通常使用Type Debug来做这件事,但是我发现在C语言中有一种方法可以使用“使用”关键字(参见)。我唯一的问题是,似乎没有一种方法来嵌套这些。以下是我想要实现的目标: using ConfigValue = System.Collections.Generic.List< System.String >; using ConfigKey = System.String; using ConfigSec

我有一个类来处理配置文件,我想整理代码,使其更具可读性和可维护性。在C++中,我通常使用Type Debug来做这件事,但是我发现在C语言中有一种方法可以使用“使用”关键字(参见)。我唯一的问题是,似乎没有一种方法来嵌套这些。以下是我想要实现的目标:

using ConfigValue = System.Collections.Generic.List< System.String >;
using ConfigKey = System.String;
using ConfigSection = System.Collections.Generic.Dictionary< ConfigKey, ConfigValue >;
使用ConfigValue=System.Collections.Generic.List;
使用ConfigKey=System.String;
使用ConfigSection=System.Collections.Generic.Dictionary
如果我更改了ConfigKey或ConfigValue的类型而忘记更改ConfigSection,我如何在不显式设置ConfigSection的情况下实现这一点

谢谢


艾伦

不幸的是,你不能这样做。在C/C++中,typedef的主要C#替代方法通常是类型推断,例如使用
var
关键字,但在许多情况下,您仍然需要键入泛型定义。几乎所有的C#程序员都使用VisualStudio或其他IDE,这是有原因的,在很多情况下,这些IDE可以避免他们键入所有内容

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

你可以考虑做的一件事当然是把实际的类从你想要的TyPufF中提炼出来,例如:

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>
{
}
公共类配置值:列表
{
}
公共类配置密钥
{
私有字符串;
公共配置密钥(字符串s)
{
这个.s=s;
}
//隐式运算符将允许您编写以下内容:
//ConfigKey c=“测试”;
//字符串s=c;
公共静态隐式运算符字符串(ConfigKey c)
{
返回c.s;
}
公共静态隐式运算符ConfigKey(字符串s)
{
返回新的配置密钥;
}
}
公共类配置部分:字典
{
}

但这当然是过分的,除非你还有其他理由想要创建具体的类。

你不能,而且
使用x=y
不应该用来创建类型别名。
它应该用来创建名称空间别名,解决冲突(例如,名称空间和共享相同名称的类)。

当然你不能“忘记”,因为你在字典中添加项的任何地方都会因为不满足强类型泛型约束而失败。实际上我相信我不会这么做。为什么具有实际类型名称是不可读的?也许
ConfigValue
而不是
List
看起来更“可读”,但我仅仅通过阅读代码就不知道实际的类型…使用可以用来创建类型。但是,它们的作用域仅在当前源文件中。