如何設置參數的定義值?我的意思是,例如,我有以下功能:如何在C#中爲參數設置定義的值?
int functionA(string parameterA) {}
現在,當我呼籲參數α這個功能和輸入值,我想要的值是在我所定義的值。例如,定義的值設置爲:
string[] definedParameterA = { "Hello World", "stackoverflow" };
參數α我輸入的值必須是「Hello World」的或「計算器」。
如何設置參數的定義值?我的意思是,例如,我有以下功能:如何在C#中爲參數設置定義的值?
int functionA(string parameterA) {}
現在,當我呼籲參數α這個功能和輸入值,我想要的值是在我所定義的值。例如,定義的值設置爲:
string[] definedParameterA = { "Hello World", "stackoverflow" };
參數α我輸入的值必須是「Hello World」的或「計算器」。
如果你真的希望它是一個字符串,你只是驗證它的方法開始:
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
}
也許靜態類可以幫助你。
public static class MyValidParameters
{
public static const string HelloWorld = "Hello World";
public static const string Stackoverflow = "stackoverflow";
//
}
所以你可以有任何類型的複雜參數(不僅是字符串),你可以在不同的靜態類中管理它們。
我想改一下約翰飛碟雙向的答案最籠統:
您使用的字符串。一個字符串是一個無限的類型,可以包含幾乎所有可能的數值範圍,從null
到""
到莎士比亞的完整作品。如果您只希望少數可能的值,那麼無限數據類型可能不適合您。也許你可以用有界的數據類型替換它?
正如John Skeet所示,系統內置的最簡單的有界數據類型是Enums。它們提供了一組封閉的可能值。所以你得到你的輸入,將它映射到值列表中,並從現在起使用它。但是,有一些併發症。首先是John Skeet提到的可能的性能損失。第二個是不是所有的字符串都可以表示爲Enum值。例如,「Hello World」不是有效的C#標識符,因此很難將其映射到枚舉中。
這可以通過使用[Description("Hello world")]
或[DisplayName("Hello world")]
屬性裝飾枚舉值並使用反射來匹配它來完成,但它有其自身的性能損失。在這種情況下,您可能會考慮使用某種靜態實用程序將字符串映射到枚舉值。
感謝您的信息 – 2013-02-17 10:32:33
'ArgumentOutOfRangeException'也是一種可能的類型。 – 2013-02-17 08:17:06
@JeppeStigNielsen:是的,我考慮過。可能更適合於枚舉版本比字符串版本。 – 2013-02-17 08:18:51
很好的幫助,謝謝喬恩 – 2013-02-17 10:32:53