使用C#中的开关处理所有蜂箱

使用C#中的开关处理所有蜂箱,c#,registry,C#,Registry,我试图使用switch处理注册表中所有可能的配置单元-稍后,我想为作为输入提供的项(连同配置单元)生成子键名,但仍然会出现以下错误: '此范围中已定义名为'regKey'的局部变量' '名称'regKey'在当前上下文中不存在' switch (hive) { case "HKEY_CLASSES_ROOT": RegistryKey regKey=Registry.ClassesRoot.OpenSubKey(key,f

我试图使用switch处理注册表中所有可能的配置单元-稍后,我想为作为输入提供的项(连同配置单元)生成子键名,但仍然会出现以下错误: '此范围中已定义名为'regKey'的局部变量' '名称'regKey'在当前上下文中不存在'

switch (hive) {  

    case "HKEY_CLASSES_ROOT":

                   RegistryKey regKey=Registry.ClassesRoot.OpenSubKey(key,false);
                   break;                                 

    case "HKEY_CURRENT_USER":

                   RegistryKey regKey=Registry.CurrentUser.OpenSubKey(key,false);
                   break;  

    case "HKEY_LOCAL_MACHINE":

                   RegistryKey regKey=Registry.LocalMachine.OpenSubKey(key,false);
                   break;

    case "HKEY_USERS":

                   RegistryKey regKey=Registry.Users.OpenSubKey(key,false);
                   break;  

    case "HKEY_CURRENT_CONFIG":

                   RegistryKey regKey=Registry.CurrentConfig.OpenSubKey(key,false);
                   break;  

    default:
        throw new System.Exception("Incorrent hive");
}

我相信错误在于您试图在同一个程序中声明变量的乘法次数。我会尝试将变量的创建移动到您的开关结构之外,然后在开关结构期间只为其分配一个值。

如果您想要
case
您可以尝试模式匹配(您需要c#8.0),例如

或者为了摆脱讨厌的
注册表。。。OpenSubKey(key,false)
您可以将键移动到
字典中

private static Dictionary<string, RegistryKey> s_RegRoots = 
  new Dictionary<string, RegistryKey>(StringComparer.OrdinalIgnoreCase) {
    {"HKEY_CLASSES_ROOT",   Registry.ClassesRoot},
    {"HKEY_CURRENT_USER",   Registry.CurrentUser},
    {"HKEY_LOCAL_MACHINE",  Registry.LocalMachine},
    {"HKEY_USERS",          Registry.Users},
    {"HKEY_CURRENT_CONFIG", Registry.CurrentConfig},
};

...


RegistryKey regKey = s_RegRoots.TryGetValue(hive, out var root)
  ? root.OpenSubKey(key, false)
  : throw new NotSupportedException("Incorrent hive");
private static Dictionary s\u RegRoots=
新字典(StringComparer.OrdinalIgnoreCase){
{“HKEY_CLASSES_ROOT”,Registry.ClassesRoot},
{“HKEY_CURRENT_USER”,Registry.CurrentUser},
{“HKEY_LOCAL_MACHINE”,Registry.LocalMachine},
{“HKEY_用户”,Registry.USERS},
{“HKEY_CURRENT_CONFIG”,Registry.CurrentConfig},
};
...
RegistryKey regKey=s_RegRoots.TryGetValue(配置单元,输出变量根)
? root.OpenSubKey(key,false)
:抛出新的NotSupportedException(“不相关的配置单元”);

我也在考虑,但如何声明空注册表项?只是RegistryKey regKey=新的RegistryKey();(在switch之前)我自己对RegistryKey没有做太多的工作,但知道在switch结构中声明变量不起作用,只需将
RegistryKey regKey在开关之前。不需要初始化它。这样,如果您在方法末尾尝试使用
regKey
,编译器可以检查所有在该用法上收敛的路径是否都初始化
regKey
,实际上,cases中变量的生存期是开关本身。虽然很少有用,而且更难阅读,但您可以
goto label
并重用相同的变量。
private static Dictionary<string, RegistryKey> s_RegRoots = 
  new Dictionary<string, RegistryKey>(StringComparer.OrdinalIgnoreCase) {
    {"HKEY_CLASSES_ROOT",   Registry.ClassesRoot},
    {"HKEY_CURRENT_USER",   Registry.CurrentUser},
    {"HKEY_LOCAL_MACHINE",  Registry.LocalMachine},
    {"HKEY_USERS",          Registry.Users},
    {"HKEY_CURRENT_CONFIG", Registry.CurrentConfig},
};

...


RegistryKey regKey = s_RegRoots.TryGetValue(hive, out var root)
  ? root.OpenSubKey(key, false)
  : throw new NotSupportedException("Incorrent hive");