我是C#的新手,我正试图找出测试方法是否正确返回的最佳方法,即;该方法是否获得了我想要的信息。
正是使这种困难的类型。有没有办法让我有时会回归bool,有时还会返回别的东西?
在PHP中我会像这样创建我的函数
function myFunc(){
//Do Stuff
if(/*whatever*/) return (string) "abcdefg";
return false; //otherwise it will just return false
}
然后像这样调用它来测试它是否有效
if(!$var=myFunc()) die("It Didn't Work");
echo $var;
但是使用C#,我的函数必须返回一个指定的类型,而不是字符串或bool false,如果它没有用完。
如果在C#中我有一个返回IntPtr的方法,我可以让它返回(IntPtr) 0
而不是false,但这很麻烦,而且可能有更好的方法。
任何想法?在C#中执行此操作的标准和常用方法是什么?
答案 0 :(得分:6)
这里通常有两种方法:
适当的方法取决于这是做什么的。如果“假”案件确实是特殊情况而非常态,那么提出异常是处理它的适当方式。
但是,如果你正在做一些像解析用户输入这样的事情,那就是你会“失败”,那么使用TryXXX方法就是一个很好的例子。这看起来像是:
bool TryMyFunc(out string result)
{
if (...)
{
result = "abcdefg";
return true;
}
result = string.Empty;
return false;
}
这就是Int32.TryParse在框架中的工作方式,例如。
答案 1 :(得分:4)
您始终可以返回null。
string Foo()
{
if (!success) return null;
return "abcd";
}
然后检查这样的电话:
var tmp = Foo();
if (tmp == null) return -1;
// tmp is a string so do your work
null返回只能用于object,遗憾的是你不能用int做。在这种情况下抛出异常或使用可空的int:
int? Bar()
答案 2 :(得分:1)
在您的示例中,我将从C#中的函数返回null:
public string myFunc(){
//Do Stuff
if(/*whatever*/) return "abcdefg";
return null;
}
然后在你的主叫代码中:
string myVar = myFunc();
if(null != myVar)
{
throw new Exception();
}
Console.WriteLine(myVar);
应该注意的是,无论何时你为非特殊情况抛出异常(意味着,如果你对myFunc的调用在合理使用中可以返回null),你将会受到严重的性能损失。生成异常需要很长时间,因此通常最好避免它们,可能是在调用myFunc之前使用先决条件检查。
在您处理非可空值类型的情况下,C#有一个名为Nullable Types的概念。
答案 3 :(得分:1)
如果你的意图是如何返回类型,你可以使用元组<>
public Tuple<string,bool> myFunc()
{
//Do Stuff
if(/*whatever*/) return (string) new Tuple<string,bool>("abcdefg",true);
return new Tuple<string,bool>(null,false);
}
答案 4 :(得分:0)
使用基于异常的编程:
public string Blah()
{
if (whatever)
{
return "abcdefg";
}
throw new Exception("Something went wrong");
}
或者你可以返回null或string.Empty
答案 5 :(得分:0)
就个人而言,我更喜欢使用null。
public string foo()
{
if (whatever)
{
return "abc";
}
return null;
}
然后:
if(foo() != null)
{
//do something
}
else
{
// *It Didn't Work*
}