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)
基本上你不能.为这些调用生成的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)
您无法检查这一点,因为具有可选参数的方法是具有所有参数的常规方法,包括具有默认值的参数。因此,您的方法将被编译为:
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)
您可以比较 或optionalstr的optionalint值是否等于默认值,但您不能真正判断它是由编译器还是开发人员提供的。
| 归档时间: |
|
| 查看次数: |
9758 次 |
| 最近记录: |