2017-02-27 24 views
-2

輸入參數驗證後立即拋出異常據我所知,GetInfo1方法從下面提供更好的可讀性。但是,在以下兩種方法之間是否存在其他差異(例如運行時執行),即在方法開始時立即拋出異常與方法結束相比較?C# - 是否有任何額外的優勢,在方法

public string GetInfo1(string name) { 
     if(string.IsNullOrWhiteSpace(name)) 
      throw new ArgumentException(nameof(name)); 

     var info = GetInfoByName(name); 
     return info; 
    } 

public string GetInfo2(string name) { 
     if(!string.IsNullOrWhiteSpace(name)) { 
      var info = GetInfoByName(name); 
      return info; 
     } 
     throw new ArgumentException(nameof(name)); 
    } 
+6

請注意,拋出'ArgumentNullException'爲非空參數是非常糟糕的形式。如果我調用'GetInfo1(「」)'我可能會期望'ArgumentException',但不是'ArgumentNullException'。 –

+0

同意@JonSkeet,但添加了僞代碼只是好奇,以找到差異。我會更新它。謝謝 –

回答

0

在開始時投擲意味着您在對其做任何事情之前驗證所有信息。這也意味着代碼不需要運行不需要的代碼。

如果您在開始時檢查所有內容(當您最終嵌套大量if時特別有效),它也可能比有大量if語句檢查值更加整潔。

同樣值得注意的是,像Resharper這樣的東西建議您儘快從方法中退出。因此GetInfo1是建議的最佳做法推薦的方式。

所以,在開始短退出比較好,因爲:

  1. 這是更具可讀性
  2. 它遵循建議的最佳做法,如果整個方法聲明
  3. 代碼沒有按
  4. 避免了很多不必要的運行不需要運行。
+1

我相信當你早退時,更容易推理代碼。 –

+0

@CallumLinington我沒有在我的文章中提到過,因爲他已經說過他知道它更具可讀性,但爲了清晰起見,我添加了它。 – webnoob

+0

@webnoob我想如果塊內部的代碼在GetInfo2的情況下將不會運行,因爲if條件將計算爲false,但只是throw語句位於n個語句之後。 –

1

我認爲GetInfo1方法更加靈活,並且提供了更好的可擴展性。您可以添加代碼(更多如果語句)來驗證更多案例而不刪除任何內容。我的意思是一般。如果您只想檢查空白或空格,並且您確信將來不會驗證更多的案例,那麼這兩種方法都可以。

另外,請記住,例外情況應該用於例外情況。用戶忘記填寫字段或錯誤輸入空格是很常見的。

相關問題