我发现此代码搜索注册表项,如果我将其设置为void并使用messagebox.show弹出一个窗口,它可以正常工作,我看到它找到的密钥。但是,如果我更改它以返回一个字符串,编译器失败,“并非所有代码路径都返回一个值”如果我尝试在名为“reg_result”的方法中设置一个字符串并返回它,我将值返回给字符串调用方法的变量。
string reg_result2 = Search_For_Registry_Keys(Registry.Users, search);
private static string Search_For_Registry_Keys(RegistryKey rk, string search)
{
string reg_result = "";
if (rk.SubKeyCount > 0)
{
foreach (var temp in rk.GetSubKeyNames())
{
if (temp.ToLower().Contains(search.ToLower()))
{
reg_result = (String.Format(rk.Name + "\\" + temp));
MessageBox.Show(String.Format("Match Found In Registry Key {0} Present At Location {1}", temp, rk.Name + "\\" + temp));
return reg_result;
}
}
foreach (var temp in rk.GetSubKeyNames())
{
try
{
if (rk.OpenSubKey(temp).SubKeyCount > 0)
{
Search_For_Registry_Keys(rk.OpenSubKey(temp), search);
}
}
catch
{
}
}
}
}
然后我通过在if语句之后放置第二个返回并且摆脱了“并非所有代码路径返回值”的编译错误来尝试以下操作,但这似乎没有帮助,因为该方法永远不会当我走过它直到它到达它的搜索结束时返回,所以我很少迷失在如何解决这个问题?是的我是新手。我想我的第一个代码可以工作,我只需要一个回报,当我找到我要找的结果时......:)
答案 0 :(得分:2)
如果你定义一个函数返回一个值(通过声明返回值的类型),你必须在每一个案例中返回一个值,不仅在你找到你要找的东西时,而且当你发现DON时找到你要找的东西。放return reg_result
;作为你的函数的最后一行,它应该工作。当然,如果你想要一些你没有找到你想要的空字符串以外的指标,你可能想要更改你返回的值。
答案 1 :(得分:1)
在这种情况下,您应该在方法顶部创建一个空字符串
var retValue = string.Empty;
然后将此return reg_result
更改为此
retValue = reg_result;
然后在所有ifs之外的方法结束时,等等。
return retValue;
希望这有帮助。
答案 2 :(得分:1)
您的代码应如下所示(注释表示更改):
private static string Search_For_Registry_Keys(RegistryKey rk, string search)
{
string reg_result = "";
if (rk.SubKeyCount > 0)
{
foreach (var temp in rk.GetSubKeyNames())
{
if (temp.ToLower().Contains(search.ToLower()))
{
reg_result = (String.Format(rk.Name + "\\" + temp));
MessageBox.Show(String.Format("Match Found In Registry Key {0} Present At Location {1}", temp, rk.Name + "\\" + temp));
return reg_result;
}
}
foreach (var temp in rk.GetSubKeyNames())
{
try
{
if (rk.OpenSubKey(temp).SubKeyCount > 0)
{
// Added and changed lines here
string retVal = Search_For_Registry_Keys(rk.OpenSubKey(temp), search);
if (!retVal.Equals(""))
{
return retVal;
}
}
}
catch
{
}
}
}
// Added this line
return reg_result;
}
请注意我已完成的操作:如果根本找不到密钥,则返回""
(最初分配给reg_result
的值)。此外,当您递归一个子键(在第二个foreach
循环中)并且执行找到结果时,会立即返回该结果。
每当你有一个承诺返回值的方法时,你必须确保通过它的所有代码路径a)实际返回一个值,或b)抛出一个未捕获的异常。
答案 3 :(得分:0)
大编辑:
忽略我发布的内容;这是无稽之谈。只要看看dlev的回答,那就更好了!