C# 函数返回路径

C# 函数返回路径,c#,.net,tdd,return,C#,.net,Tdd,Return,我有以下代码,我真的不喜欢“return string.Empty;”最后,但这是我唯一能阻止VisualStudio对我咆哮的方法 有人能给我一些避免这种情况的建议吗?或者何时或如何使用“使用” 还有关于TDD的好资源吗?我不知道如何为此编写测试 private string GetWMIProperty(string property) { SelectQuery selectQuery = new SelectQuery("Win32_OperatingSystem");

我有以下代码,我真的不喜欢“return string.Empty;”最后,但这是我唯一能阻止VisualStudio对我咆哮的方法

有人能给我一些避免这种情况的建议吗?或者何时或如何使用“使用”

还有关于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;
}

如果过程有返回值,则必须覆盖该过程的每个出口点

如果你找不到一个属性,也许你认为这是一个错误,你应该提出一个:

throw new Exception("Cannot find property");

如果过程有返回值,则必须覆盖该过程的每个出口点

如果你找不到一个属性,也许你认为这是一个错误,你应该提出一个:

throw new Exception("Cannot find property");
问题:您正在从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;
}
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:如果foreach循环可以迭代超过1次,那么最好将项目保存到某个集合中,然后返回该集合而不是字符串

试试这个:

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;
}
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;
}
问题:您正在从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;
}
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:如果foreach循环可以迭代超过1次,那么最好将项目保存到某个集合中,然后返回该集合而不是字符串

试试这个:

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;
}
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;
}

如果在using块之外创建一个变量来保存foreach循环中生成的mo[property]值,则可以在方法块的末尾使用一条返回语句,如下所示。看起来您希望在using语句中生成多个字符串,在这种情况下,您希望将值变量和返回类型设置为字符串列表

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
   }

如果在using块之外创建一个变量来保存foreach循环中生成的mo[property]值,则可以在方法块的末尾使用一条返回语句,如下所示。看起来您希望在using语句中生成多个字符串,在这种情况下,您希望将值变量和返回类型设置为字符串列表

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
   }

这实际上取决于你想如何处理没有找到财产的特殊情况

如果确实不是预期的,那么您的用例肯定是抛出异常的好候选:

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。

这实际上取决于如何处理未找到属性的异常情况

如果确实不是预期的,那么您的用例肯定是抛出异常的好候选:

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。

这有点微妙,但问题是,当您将返回放入foreach循环时,实际上是在执行以下操作:

if (myCollection.Count > 0) 
{
    return myCollection[0];
}
else
{
    // This path doesn't have a return value!!!
}
这就是VS抱怨的原因。由于您只返回第一个值,因此最好执行以下操作:

 return searcher.Get().FirstOrDefault();

而不是foreach循环

这有点微妙,但问题是,当你将回报放入foreach循环时,你实际上是在做这样的事情:

if (myCollection.Count > 0) 
{
    return myCollection[0];
}
else
{
    // This path doesn't have a return value!!!
}
这就是VS抱怨的原因。由于您只返回第一个值,因此最好执行以下操作:

 return searcher.Get().FirstOrDefault();

而不是foreach循环

string.empty中有什么错误?为什么不喜欢它?这是三个非常不同的主题:使用语句、TDD和代码路径。选择一个,为剩下的主题创建另外两个问题。为什么要在foreach中返回?提示:关于您的TDD问题,您不应该在堆栈溢出时请求非现场资源。你们应该提出一个具体的问题,并询问这个问题。使用和VS投诉无关。问题是,如果Get返回空集合,则该方法不会返回任何内容,这是不正确的。另外,您是否知道,如果Get return返回多个项目,则只返回第一个项目?string.empty中有什么错误?为什么不喜欢它?这是三个非常不同的主题:使用语句、TDD和代码路径。选择一个,为剩下的主题创建另外两个问题。为什么要在foreach中返回?提示:关于您的TDD问题,您不应该在堆栈溢出时请求非现场资源。你们应该提出一个具体的问题,并询问这个问题。使用和VS投诉无关。问题是我
f Get返回空集合方法不会返回任何内容,这是不正确的。另外,您是否知道,如果Get return返回多个项-只返回第一项?值将超出范围,因为它是在using块中声明的。@LeeO:在selectQuery变量顶部声明它,检查我编辑的应答值将超出范围,因为它是在using块中声明的。@LeeO:在selectQuery变量顶部声明它,检查我编辑的应答