C# 函数返回路径
我有以下代码,我真的不喜欢“return string.Empty;”最后,但这是我唯一能阻止VisualStudio对我咆哮的方法 有人能给我一些避免这种情况的建议吗?或者何时或如何使用“使用” 还有关于TDD的好资源吗?我不知道如何为此编写测试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");
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变量顶部声明它,检查我编辑的应答