2013-02-17 32 views
2

如何設置參數的定義值?我的意思是,例如,我有以下功能:如何在C#中爲參數設置定義的值?

int functionA(string parameterA) {} 

現在,當我呼籲參數α這個功能和輸入值,我想要的值是在我所定義的值。例如,定義的值設置爲:

string[] definedParameterA = { "Hello World", "stackoverflow" }; 

參數α我輸入的值必須是「Hello World」的或「計算器」。

回答

4

如果你真的希望它是一個字符串,你只是驗證它的方法開始:

private static readonly String[] ValidValues = {"Hello World", "stackoverflow"}; 

public void DoSomething(string text) 
{ 
    if (!ValidValues.Contains(text)) 
    { 
     throw new ArgumentException("Invalid value: " + text, "text"); 
    } 
    // Carry on 
} 

不過,你也可以考慮使用一個枚舉來代替。你仍然需要驗證枚舉值定義,但它使簡單的調用者得到它的權利:

​​

您可以在其他地方從枚舉值到字符串的映射,如果你願意,當然。

請注意,上述代碼將在每次調用時輸入message。如果你真的需要,那麼你可以避免使用我的Unconstrained Melody項目(並使它更安全),但是直到你證明這個拳擊確實是一個問題,它可能是不值得的。代碼將如下所示:

public void DoSomething(Message message) 
{ 
    if (!message.IsNamedValue()) // Extension method 
    { 
     throw new ArgumentException("Invalid value: " + message, "message"); 
    } 
    // Carry on 
} 
+0

'ArgumentOutOfRangeException'也是一種可能的類型。 – 2013-02-17 08:17:06

+0

@JeppeStigNielsen:是的,我考慮過。可能更適合於枚舉版本比字符串版本。 – 2013-02-17 08:18:51

+0

很好的幫助,謝謝喬恩 – 2013-02-17 10:32:53

0

也許靜態類可以幫助你。

public static class MyValidParameters 
{ 
    public static const string HelloWorld = "Hello World"; 
    public static const string Stackoverflow = "stackoverflow"; 
    // 
} 

所以你可以有任何類型的複雜參數(不僅是字符串),你可以在不同的靜態類中管理它們。

0

我想改一下約翰飛碟雙向的答案最籠統:

您使用的字符串。一個字符串是一個無限的類型,可以包含幾乎所有可能的數值範圍,從null""到莎士比亞的完整作品。如果您只希望少數可能的值,那麼無限數據類型可能不適合您。也許你可以用有界的數據類型替換它?

正如John Skeet所示,系統內置的最簡單的有界數據類型是Enums。它們提供了一組封閉的可能值。所以你得到你的輸入,將它映射到值列表中,並從現在起使用它。但是,有一些併發症。首先是John Skeet提到的可能的性能損失。第二個是不是所有的字符串都可以表示爲Enum值。例如,「Hello World」不是有效的C#標識符,因此很難將其映射到枚舉中。

這可以通過使用[Description("Hello world")][DisplayName("Hello world")]屬性裝飾枚舉值並使用反射來匹配它來完成,但它有其自身的性能損失。在這種情況下,您可能會考慮使用某種靜態實用程序將字符串映射到枚舉值。

+0

感謝您的信息 – 2013-02-17 10:32:33

相關問題