我有以下代码,我真的不喜欢'return string.Empty;'最后,但这是我可以让Visual Studio不再咆哮的唯一方法。
有人可以就避免这种情况给我一些建议吗?或何时或如何使用'使用'
TDD还有很好的资源吗?我无法弄清楚如何为此编写测试。
private string GetWMIProperty(string property)
{
SelectQuery selectQuery = new SelectQuery("Win32_OperatingSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery))
{
string value = string.Empty;
foreach (ManagementObject mo in searcher.Get())
{
return mo[property].ToString();
}
}
return string.Empty;
}
答案 0 :(得分:2)
如果程序具有返回值,则必须涵盖过程的每个出口点。
如果你找不到房产,或许你认为这是一个错误,你应该提出一个:
throw new Exception("Cannot find property");
答案 1 :(得分:2)
问题:您将从foreach循环返回,以便它只返回第一个项目。
解决方案1:如果您确定只有一个项目将从foreach循环返回,那么您可以将其保存在字符串变量中并在最后返回。
试试这个:
private string GetWMIProperty(string property)
{
string value = string.Empty;
SelectQuery selectQuery = new SelectQuery("Win32_OperatingSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery))
{
foreach (ManagementObject mo in searcher.Get())
{
value = mo[property].ToString();
}
}
return value;
}
解决方案2:如果您的foreach循环可以迭代超过1次,那么最好将项目保存到某个Collection中,然后返回该Collection而不是字符串
试试这个:
private List<string> GetWMIProperty(string property)
{
List<string> value =new List<string>();
SelectQuery selectQuery = new SelectQuery("Win32_OperatingSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery))
{
foreach (ManagementObject mo in searcher.Get())
{
value.Add(mo[property].ToString());
}
}
return value;
}
答案 2 :(得分:1)
这实际上取决于您希望如何处理未找到属性的例外情况。
如果真的没有预期,那么你的用例肯定是抛出异常的好选择:
private string GetWMIProperty(string property)
{
SelectQuery selectQuery = new SelectQuery("Win32_OperatingSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery))
{
...
}
thrown new ArgumentException("no WMI property found for specified property name", "property");
}
如果在某些情况下是预期的并且没关系,那么只需返回默认值(例如string.Empty
)。
答案 3 :(得分:0)
如果在“using”块之外创建一个变量来保存foreach循环中生成的mo [property]值,则可以在方法块的末尾使用单个return语句,如下所示。看起来你期望在using语句中生成多个字符串,在这种情况下,你需要创建“value”变量,返回类型是字符串列表。
private List<string> GetWMIProperty(string property)
{
List<string> values = new List<string>();
SelectQuery selectQuery = new SelectQuery("Win32_OperatingSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery))
{
foreach (ManagementObject mo in searcher.Get())
{
values.Add(mo[property].ToString());
}
}
return values
}
答案 4 :(得分:0)
这有点微妙,但问题是,当你把回程放在foreach
循环中时,你实际上是在做这样的事情:
if (myCollection.Count > 0)
{
return myCollection[0];
}
else
{
// This path doesn't have a return value!!!
}
这就是VS抱怨的原因。由于您只返回第一个值,或许最好这样做:
return searcher.Get().FirstOrDefault();
而不是foreach循环。