C# 改进现有代码段所需的帮助

C# 改进现有代码段所需的帮助,c#,C#,我写了一段代码片段,我肯定觉得它写得不正确。 我的方法必须返回一个基于我机器上安装的Adobe版本的字符串 private string GetRegistryKeyPathForX() { string sPath = string.Empty; RegistryKey adobe = Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Adobe");

我写了一段代码片段,我肯定觉得它写得不正确。 我的方法必须返回一个基于我机器上安装的Adobe版本的字符串

private string GetRegistryKeyPathForX()
        {
            string sPath = string.Empty;
            RegistryKey adobe = Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Adobe");
            if (adobe != null)
            {
                RegistryKey acroRead = adobe.OpenSubKey("Adobe Acrobat");
                if (acroRead != null)
                {
                    string[] acroReadVersions = acroRead.GetSubKeyNames();
                    //The following version(s) of Acrobat Reader are installed
                    foreach (string versionNumber in acroReadVersions)
                    {
                        switch(versionNumber)
                        {
                            case "6.0": sPath = "Software\\Adobe\\Acrobat Reader";
                                        return sPath;  //Improve here
                                        break;

                            case "7.0":
                                        sPath = "";
                                        return sPath;   //Improve here
                                        break;
                            case "8.0": 
                                        sPath = "";
                                        return sPath;   //Improve here
                                        break;
                            case "9.0" :
                                        sPath = "Software\\Adobe\\Acrobat Reader";
                                        return sPath;   //Improve here
                                        break;
                            default: sPath = "ERR_KEY";
                                            break;
                        }  
                    }
                }
            }
        return sPath;
    }

有没有一种方法可以让我一次返回字符串,而不是在每个case语句中分配它?

是:您不需要赋值或break语句:

case "6.0": return "Software\\Adobe\\Acrobat Reader";
如果你能得到一份它的副本,这对这类事情真的很有帮助:在这种情况下,它将以灰色突出显示未使用的代码中断语句,并提供自动删除赋值的功能。

无需编写中断;因为它从那里返回值

switch(versionNumber)
 {
     case "6.0": return "Software\\Adobe\\Acrobat Reader";  
     .
     .
     .
 }
或在switch语句之后返回

switch(versionNumber)
 {
     case "6.0": sPath = "Software\\Adobe\\Acrobat Reader";          
         break;
     .
     .
     .
 }
 return sPath;

如果您只是优化了开关,您可以编写:

switch(versionNumber)
{
   case "6.0": 
   case "9.0": 
      return "Software\\Adobe\\Acrobat Reader";
  case "7.0":
  case "8.0": 
      return string.Empty;
  default: 
      return "ERR_KEY";
}
但是,我更喜欢使用映射而不是开关,特别是如果您在多个位置需要此逻辑,那么您可以:

Dictionary<string, string> versionPaths = new Dictionary<string, string>();
versionPaths.Add("6.0","Software\\Adobe\\Acrobat Reader");
versionPaths.Add("7.0",string.empty);
....
if (versionPaths.ContainsKey(versionNumber))
  return versionPaths[versionNumber];
else
  return "ERR_KEY";

您可以使用以下内容替换回路和开关:

if (acroRead.GetSubKeyNames().ToList().FindAll(versionNumber => versionNumber.Equals("6.0") || versionNumber.Equals("9.0")).Count > 0)
   return "Software\\Adobe\\Acrobat Reader";
编辑:.NET 2版本:

if (Array.FindAll<string>(acroRead.GetSubKeyNames(), delegate(string versionNumber) { return versionNumber.Equals("6.0") || versionNumber.Equals("9.0"); }).Length > 0)

谢谢……这也可以,但我不允许在2.0框架中使用Linq查询。@这对我来说很公平,还用纯2.0代码更新了我的答案:
if (Array.FindAll<string>(acroRead.GetSubKeyNames(), delegate(string versionNumber) { return versionNumber.Equals("6.0") || versionNumber.Equals("9.0"); }).Length > 0)