我已经编写了一个代码片段,我肯定觉得它写得不正确。 我的方法必须根据我机器中Adobe Installed的版本返回一个字符串。
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语句中分配它。?
答案 0 :(得分:6)
如果你只是优化开关,你可以写:
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";
答案 1 :(得分:2)
是:您既不需要作业,也不需要break
声明:
case "6.0": return "Software\\Adobe\\Acrobat Reader";
如果你能得到ReSharper的副本,它可以真正帮助解决这类问题:在这种情况下,它会突出显示灰色的未使用的代码break
语句,它会自动提供删除作业。
答案 2 :(得分:1)
无需编写break;
,因为它从那里返回值
switch(versionNumber)
{
case "6.0": return "Software\\Adobe\\Acrobat Reader";
.
.
.
}
OR 在切换语句后返回
switch(versionNumber)
{
case "6.0": sPath = "Software\\Adobe\\Acrobat Reader";
break;
.
.
.
}
return sPath;
答案 3 :(得分:1)
您可以用以下代码替换循环和switch
:
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)
答案 4 :(得分:0)
private string GetRegistryKeyPathForX()
{
var adobe = Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Adobe");
if (adobe == null)
{
return string.Empty;
}
RegistryKey acroRead = adobe.OpenSubKey("Adobe Acrobat");
if (acroRead == null)
{
return string.Empty;
}
string[] acroReadVersions = acroRead.GetSubKeyNames();
//The following version(s) of Acrobat Reader are installed
foreach (string versionNumber in acroReadVersions)
{
switch (versionNumber)
{
case "6.0": return "Software\\Adobe\\Acrobat Reader";
case "7.0": return "";
case "8.0": return "";
case "9.0": return "Software\\Adobe\\Acrobat Reader";
default: break;
}
}
return "ERR_KEY";
}