在C#中 - 可选参数 - 为其他未提供的参数创建完成。
所以,如果我写:
void Go(int a, bool isFalse = true)
并致电Go(a)
它实际上会为Go(a, true)
发出il代码。
命名参数怎么样,如何切换订单在幕后工作?
例如:
Go(isFalse:true, a:1) //order has been switched.
答案 0 :(得分:2)
例如,如果你有这样的东西
void Go ( int a , bool isFalse, bool isEmpty)
在您致电Go(1,isEmpty : true, isFalse : false)
之后,它将生成此功能调用
Go ( 1, false, true)
答案 1 :(得分:2)
当您致电Go(a)
时,它会调用Go(a, true)
而不是Go(a, false)
。例如;
using System;
namespace Programs
{
public class Program
{
public static void Main(string[] args)
{
Go(5);
}
static void Go(int a, bool isFalse = true)
{
Console.WriteLine("Int is {0}, Boolean is {1}", a, isFalse);
}
}
}
输出是:
Int为5,布尔值为True
如果isFalse
值被调用时未使用,则将true
值设置为SomeMethod(bool isFalse, bool isFull, bool isStacked)
。但是如果你关心订单,你必须使用你在方法中描述的订单。例如;
如果你有像
这样的方法 SomeMethod(true, false, true)
并且当您将此方法称为
时 isFalse = true
你的方法就像
一样 isFull = false
,isStacked = true
和C# 4.0
因为订单。但有时当您的方法有很多参数可以混合顺序时,您可以使用SomeMethod(isStacked: true, isFull: false, isFalse = true)
附带的命名参数。基于相同的方法,你可以这样;
SomeMethod(true, false, true)
是对
的同等号召{{1}}
答案 2 :(得分:1)
Go(a)
将汇编为Go(a, true)
。它暗示如果在引用的库中更改参数的默认值,则需要重新编译调用代码。
根据经验,命名(和默认)参数只是一个编译技巧。运行时级别的调用规则与以前的版本相同。
因此,调用Go(isFalse = true, a = 1)
实际上会编译为Go(1, true)
。