2010-04-13 96 views
2

這主要是出於好奇,並且可能是一個愚蠢的問題。 :)更快速的方法來執行方法參數檢查

我有一個方法是這樣的:

public void MyMethod(string arg1, string arg2, int arg3, string arg4, MyClass arg5) 
{ 
    // some magic here 
} 

的參數都不能爲空,並且沒有任何字符串參數可以等於String.Empty

而是我有一個大名單:

if(arg1 == string.Empty || arg1 == null) 
{ 
    throw new ArgumentException("issue with arg1"); 
} 

是有一個更快的方式只是檢查所有的字符串參數?

道歉,如果我的問題不清楚。

謝謝!

+0

我有一個看起來有點,我會張貼此作爲評論的是不是一個真正的答案。在我的書中,如果我們能夠在方法簽名中定義一個用於參數的「符號」,那將是非常好的。因此,可以說我們將符號不爲空的檢查分配給符號!,然後在方法簽名中它可以是MyMethod(string!myArg),用c#執行自動檢查和拋出異常。當然,我現在可以用一種方法來做到這一點,但是如果我可以分配一個符號,我可以在簽名中使用它,這將更快地輸出!思考? – AndrewC 2010-04-13 19:53:30

回答

7

您可以創建或使用框架,以檢查方法的合約,如Code Contracts

此外,您可以創建各種實用方法,如ThrowIfNullOrEmpty誰將封裝檢查參數的邏輯。

+0

謝謝!看着這些! – AndrewC 2010-04-13 17:11:59

3
if (string.IsNullOrEmpty(arg1)) 
{ 
    throw new ArgumentException("issue with arg1"); 
} 

還有一些code contracts在.NET 4

4

您可以使用String.IsNullOrEmpty:

if (String.IsNullOrEmpty(arg1)) 
    throw new ArgumentException("issue with arg1"); 

如果你在Framework 4中,也有一個String.IsNullOrWhiteSpace方法(也許你也想,如果有人要求用含空格的字符串的方法拋出只要)。

您可以製作實用方法來檢查參數並拋出,但這是您將得到的最短符號。 C#中沒有語法,它允許您向編譯器表示空值是不可接受的,並且該語言爲您拋出異常。

在框架4中,您還有CodeContracts - 但使用它的語法仍然是方法調用。

+1

這很酷,但我想知道是否有更快的方法。 在這裏大聲思考,但如果有某種形式的簡寫符號可以附加到方法簽名中的參數上,這樣C#將自動拋出一個參數異常(如果它爲null或空),那將會很棒。 – AndrewC 2010-04-13 17:07:38

0

那麼首先,你可以使用if (!String.IsNullOrEmpty(arg1))來減少if表達式。其次,你是否需要在你的發佈版本中進行參數檢查,還是隻需要在你的調試版本中執行arg檢查就足夠了?這取決於數據來自何處。如果你的代碼調用了這個函數,並且你的調用代碼處理了這些參數,那麼只需要在你的調試版本中檢查參數就足夠了。在這種情況下,請使用Debug.Assert(!String.IsNullOrEmpty(arg1), "msg");等。斷言將從發佈版本中刪除。

三,檢查出DevLabs: Code Contracts

3

這裏真正的問題是,你的方法有太多的爭論。這使得您編寫驗證代碼變得很笨重。在客戶端代碼中也很笨拙。考慮寫一個助手類,其中你現在傳遞的參數是屬性。你的方法現在只能使用一個參數。驗證可以在類本身而不是你的方法中完成。

框架中此模式的規範示例是Process類。ProcessStartInfo幫助器類保持它可用。

3

有一個叫CuttingEdge.Conditions好的庫,爲此提供了一個流暢的接口:

public void MyMethod(string arg1, string arg2, int arg3, string arg4, MyClass arg5) 
{ 
    Condition.Requires(arg1, "arg1").IsNotNull().IsNotEmpty().StartsWith("Foo"); 
} 

它提供了各種驗證,其中包括null檢查類型安全的條件下,對數字的範圍檢查,字符串檢查(包括StartsWith)等等......如果你有多個參數檢查,它可以大大縮短和簡化你的驗證,最重要的是,使參數檢查和異常在整個應用程序中保持一致。

+0

+1,很好的庫確實 – sll 2011-11-05 13:00:06

-1

至於我能理解你的問題,怎麼樣:

static void Main(string[] args) 
{ 
    Test(null, "", "", ""); 
} 

static void Test(MyClass arg1, params string[] args) 
{ 
    if (args.Count(a => String.IsNullOrEmpty(a)) == args.Length) 
    { 
     throw new Exception("All params are null or empty"); 
    } 
} 
+1

你的意思是if(args.Any(a => a == null ||(a是字符串&&!string.IsNullOrEmpty(a))){throw new Exception(「No param can 「)}'? – ANeves 2010-04-13 17:25:22

+0

@sr pt:謝謝! – abatishchev 2010-04-13 18:11:40