C# 方法签名中的命名参数

C# 方法签名中的命名参数,c#,.net-4.0,optional-parameters,named-parameters,C#,.net 4.0,Optional Parameters,Named Parameters,在C#-可选参数中-创建对其他未提供参数的补全 所以如果我写: void Go(int a, bool isFalse = true) 并呼叫Go(a) 它实际上发出的il代码为Go(a,true) 命名参数和如何在幕后切换顺序 例如: Go(isFalse:true, a:1) //order has been switched. Go(a)将编译为Go(a,true)。这意味着,如果参数的默认值在引用的库中更改,则需要重新编译调用代码 根据经验,命名(和默认)参数只是一种编译器技巧。

在C#-可选参数中-创建对其他未提供参数的补全

所以如果我写:

void Go(int a, bool isFalse = true)
并呼叫
Go(a)

它实际上发出的il代码为
Go(a,true)

命名参数和如何在幕后切换顺序

例如:

  Go(isFalse:true, a:1) //order has been switched.
Go(a)
将编译为
Go(a,true)
。这意味着,如果参数的默认值在引用的库中更改,则需要重新编译调用代码

根据经验,命名(和默认)参数只是一种编译器技巧。运行时级别的调用规则与以前的版本相同


因此,调用
Go(isFalse=true,a=1)
实际上将编译为
Go(1,true)

,例如,如果您有这样的代码

void Go ( int a , bool isFalse, bool isEmpty)
Go ( 1, false, true)
调用
Go(1,isEmpty:true,isFalse:false)
之后,它将生成如下函数调用

void Go ( int a , bool isFalse, bool isEmpty)
Go ( 1, false, true)
当你调用
Go(a)
时,它调用
Go(a,true)
not
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,Boolean是True

如果调用时未使用它,则将
isFalse
值设置为
true
。但是如果你关心顺序,你必须使用你在方法中描述的顺序。比如,

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);
        }
    }
}
如果你有这样的方法

SomeMethod(bool为假,bool为满,bool为固定)

当你把这个方法叫做

somethod(真、假、真)

你的方法就像

isFalse=true
isFull=false
isStacked=true

因为订单。但有时,当您的方法有很多参数,您可以混合顺序时,您可以使用
C#4.0
附带的命名参数。基于同样的方法,你可以这样做

somethod(isStacked:true,isFull:false,isFalse=true)

同样需要


SomeMethod(true、false、true)

它如何回答我的问题(而不是我给出的预览)?我确实指定了一切都是编译器技巧,因此它应该暗示命名参数遵循相同的规则。它们由编译器在调用站点重新定位。我将编辑我的回答。
Go(a)
将编译为
Go(a,true)
而不是
Go(a,false)
是的,我被真/假混淆了。修理。