功能返回路径

时间:2014-02-28 16:36:19

标签: c# .net tdd return

我有以下代码,我真的不喜欢'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;
}

5 个答案:

答案 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循环。