C# 检查函数参数的最短方法是什么,在C中可能有0、1、2、3个值#

C# 检查函数参数的最短方法是什么,在C中可能有0、1、2、3个值#,c#,C#,我在C#中有一个函数,看起来像: public static void OnlyValidInput ( int parameterName ) { if ( parameterName == 0 || parameterName ==1 || parameterName == 2 ...) { ... do Ok stuff } else { throw new CustomException ( "invalid param should be 0 ,

我在C#中有一个函数,看起来像:

public static void OnlyValidInput ( int parameterName ) 
{
    if ( parameterName == 0 || parameterName ==1 ||
         parameterName == 2 ...)
{
     ... do Ok stuff
}
else 
{ throw new CustomException ( "invalid param should be 0 , 1 , 2" );
}
}
如何使它变短

谢谢大家,答案显示了我的想法,但无法描述它…

如果(parameterName>=0&¶meterName只是为了愚蠢

if (parameterName >= 0 && parameterName <= 3)
if((parameterName & 0xFFFFFFFC) == 0) // Check if value is 0, 1, 2, 3
基本上,它只是检查低两位中是否只有一位(这仅适用于0、1、2、3)


我不会真的这样做;
&&
方法更清晰…

我会将您的关注点分为两种方法。一种用于验证输入,另一种用于实际执行操作。看起来您的parameterName值有高值和低值。如果是这样,请将其更改为小于、大于检查vs检查每一个值

public static bool IsValid(int parameterName) {
  return (parameterName >= 0) && (parameterName <= 2);
}

public static void OnlyValidInput(int parameterName) {
  if ( !IsValid(parameterName) ) {
    throw new CustomExceptoin("...");
  }
  .. Do stuff
}
公共静态bool有效(int参数名称){

return(parameterName>=0)&&(parameterName可能是OT,但在您的代码示例中,我宁愿抛出一个。

来获取编译时检查,为每个有效参数创建一个带有值的枚举,并将其作为参数而不是int传递

当然,如果你有一个非常大的范围,这将不会很好地工作,但如果它真的只是0到2,听起来更像那些数字意味着应该……枚举……无论如何

public static void OnlyValidInput ( int parameterName ) 
{
     if( new int[]{0,1,2}.Contains(parameterName))
     {
        //... do Ok stuff
     }
     else throw new CustomException ( "invalid param should be 0 , 1 , 2" );
}
该方法只接受参数类型的枚举数


当然,您不应该将枚举数及其值重命名为描述性的且易于理解的名称。

这是否会禁止使用(MyEnum)0x123?Tnx,您可以发布一个小的example@DainelL:有意思!谢谢你的邀请……:)很好的一点-您仍然需要检查参数。不过,在大多数情况下,我不喜欢强制转换为enum,而且我仍然认为,如果它真的只是0-2,那么可能还有一些东西应该命名。标题是“0,1,2,3”。代码有一个..have 2,所以我假设他刚刚放弃了3。if(0请参阅我答案的注释:您仍然可以将无效值强制转换为参数枚举。这不会验证输入。以下编译很好。SomeMethod((参数)42);这是真的。。如果参数原始类型是整数。如果不是,则我认为这是一种方法。您可能想插话,Ronny,不是吗
public enum Parameter
{
    Zero = 0,
    One = 1,
    Two = 2,
    Three = 3
}

public void SomeMethod(Parameter p)
{
    Int32 pAsInteger = (Int32)p; // Here I am casting the parameter to an Integer
}

SomeMethod((Parameter)2); // Here I am casting an integer to enum of type Parameter