方法签名中的命名参数

时间:2012-12-17 11:05:22

标签: c# .net-4.0 optional-parameters named-parameters

在C#中 - 可选参数 - 为其他未提供的参数创建完成。

所以,如果我写:

void Go(int a, bool isFalse = true)

并致电Go(a)

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

命名参数怎么样,如何切换订单在幕后工作?

例如:

  Go(isFalse:true, a:1) //order has been switched.

3 个答案:

答案 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 = falseisStacked = trueC# 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)