3

在 C# 中 - 可选参数 - 为其他未提供的参数创建一个补全。

所以如果我写:

void Go(int a, bool isFalse = true)

并打电话Go(a)

它实际上为Go(a, true).

命名参数怎么样?切换顺序是如何在幕后工作的?

例如 :

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

3 回答 3

3

例如,如果你有这样的东西

void Go ( int a , bool isFalse, bool isEmpty)

在您调用后Go(1,isEmpty : true, isFalse : false),它将生成这样的函数调用

Go ( 1, false, true)
于 2012-12-17T11:10:15.880 回答
2

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

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

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

于 2012-12-17T11:08:46.530 回答
2

当你调用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,布尔值为 True

如果在调用时未使用它isFalse,则将其设置为。true但是,如果您关心订单,则必须使用您在方法中描述的订单。例如;

如果您有类似的方法

SomeMethod(bool isFalse, bool isFull, bool isStacked)

当你调用这个方法时

SomeMethod(true, false, true)

你的方法就像

isFalse = true,isFull = falseisStacked = true

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

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

等于调用

SomeMethod(true, false, true)

于 2012-12-17T11:20:30.917 回答