2011-11-17 139 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); 
}