如何设置参数的定义值?我的意思是,例如,我有以下功能:如何在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