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