检查inside方法是否传递了一些可选参数

Yar*_*riv 10 c# nullable optional-parameters argument-passing

如何检查是否将可选参数传递给方法?

public void ExampleMethod(int required, string optionalstr = "default string",
    int optionalint = 10)
{

    if (optionalint was passed)
       return;
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用Nullable<T>.HasValue(MSDN定义,MSDN示例):

int default_optionalint = 0;

public void ExampleMethod(int required, int? optionalint,
                            string optionalstr = "default string")
{
    int _optionalint = optionalint ?? default_optionalint;
}
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 15

好吧,争论总是通过.默认参数值只是确保用户在调用函数时不必显式指定它们.

当编译器看到这样的调用时:

ExampleMethod(1);
Run Code Online (Sandbox Code Playgroud)

它默默地将其转换为:

ExampleMethod(1, "default string", 10);
Run Code Online (Sandbox Code Playgroud)

因此,确定参数是否在运行时传递在技术上是不可能的.你最接近的是:

if (optionalstr == "default string")
   return;
Run Code Online (Sandbox Code Playgroud)

但是如果用户明确地这样调用它,则行为相同:

ExampleMethod(1, "default string");
Run Code Online (Sandbox Code Playgroud)

另外,如果你真的想根据是否提供参数而有不同的行为,那就是去除默认参数并改用过载,如下所示:

public void ExampleMethod(int required)
{
    // optionalstr and optionalint not provided
}

public void ExampleMethod(int required, string optionalstr)
{
    // optionalint not provided
}

public void ExampleMethod(int required, string optionalstr, int optionalint)
{
    // all parameters provided
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 6

基本上你不能.为这些调用生成的IL 完全相同:

ExampleMethod(10);
ExampleMethod(10, "default string");
ExampleMethod(10, "default string", 10);
Run Code Online (Sandbox Code Playgroud)

默认是由编译器在调用站点执行的.

如果您确实希望这两个调用都有效但可区分,则可以使用重载:

// optionalint removed for simplicity - you'd need four overloads rather than two
public void ExampleMethod(int required)
{
    ExampleMethodImpl(required, "default string", false);
}

public void ExampleMethod(int required, string optionalstr)
{
    ExampleMethodImpl(required, optionalstr, true);
}

private void ExampleMethodImpl(int required, int optionalstr, bool optionalPassed)
{
    // Now optionalPassed will be true when it's been passed by the caller,
    // and false when we went via the "int-only" overload
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*kiy 4

您无法检查这一点,因为具有可选参数的方法是具有所有参数的常规方法,包括具有默认值的参数。因此,您的方法将被编译为:

public void ExampleMethod(int required, string optionalstr, int optionalint)
{

}
Run Code Online (Sandbox Code Playgroud)

默认值由编译器插入到调用点中。如果你会写

ExampleMethod(42);
Run Code Online (Sandbox Code Playgroud)

然后编译器会生成调用

ExampleMethod(42, "default string", 10);
Run Code Online (Sandbox Code Playgroud)

您可以比较 或optionalstroptionalint值是否等于默认值,但您不能真正判断它是由编译器还是开发人员提供的。