2011-11-17 140 views
4

我是C#的新手,我试图找出测试方法是否正确返回的最佳方法,即;该方法是否得到我想要的信息。方法返回类型

这是使这种困难的类型。有没有办法让我有时可以返回布尔,有时会返回其他东西?

在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#,我的函数返回一个指定的键入,而不是一个字符串或布尔错误,如果它不工作。

如果在C#中我有一个返回IntPtr的方法,我可以让它返回(IntPtr) 0而不是false,但这很麻烦,可能有更好的方法。

任何想法?在C#中这样做的标准和常用方法是什么?

+0

我通常只是返回'null'在情况下,一个方法是预计偶尔会失败。 – vcsjones

+0

请定义“方法没有解决”。你的意思是有一个例外吗? – Maess

+0

你可以返回null,如果你使返回类型为空 – xbonez

回答

6

通常有此两种方法:

  1. 使用Exceptions
  2. 使用TryXXX方法。

适当的方法取决于它在做什么。如果“虚假”的情况确实是非常例外的事情,那么引发例外是处理它的恰当方式。

但是,如果您正在解析用户输入,而常见的问题是“失败”,那么使用TryXXX方法就是一个很好的例子。这看起来像:

bool TryMyFunc(out string result) 
{ 
    if (...) 
    { 
     result = "abcdefg"; 
     return true; 
    } 

    result = string.Empty; 
    return false; 
} 

这是Int32.TryParse作品的框架,例如如何。基于

+0

感谢您的帮助,最佳答案 – Drahcir

0

使用异常编程:

public string Blah() 
{ 
    if (whatever) 
    { 
     return "abcdefg"; 
    } 
    throw new Exception("Something went wrong"); 
} 

或者你可以返回null或的String.Empty

+0

根据“无论”可能失败的频率,这可能是非常低效的。使用异常来控制应用程序流通常是一个坏主意。不过没有倒退,因为它肯定是一个可行的选择,取决于具体情况。 –

+0

@KileyNaro考虑到他如何用“死”来称呼他,他想要一个例外吗? – McKay

+0

绝对!这就是为什么我没有-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 

空回报将只与物体的工作,不幸的是你不能这样做,有一个int。在这种情况下抛出一个异常,使用可空INT:

int? Bar() 
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),您将会认真执行h它。生成异常需要很长时间,所以通常最好避免它们,或者在调用myFunc之前使用先决条件检查。

在处理非空值类型的情况下,C#有一个名为Nullable Types的概念。

+0

-1对不起,但你的代码很混乱,不会编译。例如'var'在使用之前没有被初始化,并且比较没有任何意义。 – ChrisWue

+0

@ChrisWue感谢您的接触,我已经修复了编译的代码。 –

+0

这更好:),删除投票 – ChrisWue

0

个人而言,我更喜欢使用null。

public string foo() 
{ 
    if (whatever) 
    { 
     return "abc"; 
    } 

    return null; 
} 

然后输入:

if(foo() != null) 
    { 
    //do something 
    } 
    else 
    { 
    // *It Didn't Work* 
    } 
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); 
}