如果在声明中为参数指定了值,该值何时适用?

时间:2018-01-13 21:12:03

标签: c#

在声明中初始化参数是什么意思?

我最近看到这个代码感到很惊讶。 什么时候引用我是-1?每时每刻?如果它被传入null?,如果它被省略?

    [HttpGet]
    [ActionName("GetBillingInfo")]
    public BillingInfo GetBillingInfo(string kValue = "", int quoteID = -1)
    {
        return _Repository.GetBillingDetails(kValue, quoteID);
    }
}

[更新]

答案是为参数赋值会使参数成为可选参数。

这个问题与询问如何创建可选参数相反。

4 个答案:

答案 0 :(得分:2)

这个概念被称为“默认值”,并允许使用不同的概念,“可选参数”。

简单地说,如果你调用方法并且不提供指定的参数,将使用它的默认值。

是什么意思

编译器可以通过两种方式解释这个概念:

  1. 调用不提供此参数的此方法将最终使用编译到被调用方法中的默认值。
  2. 在编译调用它的代码时,调用此方法不提供此参数将传入声明的默认值。
  3. 那是哪个?

    让我们看看两段独立的代码:

    public void Test(int value = 42)
    {
    }
    

    public void SomeOtherTest()
    {
        SomeInstance.Test(); // this is the same Test as above
    }
    

    让我们假设这两个项目在不同的项目中,因此将编译成不同的程序集,dll's。

    在第二段代码的编译时发生的事情是编译器发现缺少的参数value默认值42,因此将此添加到已编译的代码中。

    换句话说,第二段代码被视为如下所示:

    public void SomeOtherTest()
    {
        SomeInstance.Test(42); // this is the same Test as above
    }
    

    注意参数调用中的附加42

    因此问题中的语法意味着两件事:

    1. 在调用方法
    2. 时,可以省略具有默认值的参数
    3. 这些调用,其中省略了参数,将被编译为好像参数值一直存在,并使用该参数的默认值。
    4. 为什么这很重要?

      好吧,考虑一下上面两段代码是否存在于两个不同的项目中,然后编译成两个不同的程序集,dll's。

      如果您稍后更改了声明该方法的项目的源代码,为了提供不同的默认值,另一个项目仍然会被编译为提供42。

      除非重新编译正在进行调用的其他程序集,否则值42仍将传递给方法。

答案 1 :(得分:1)

这称为可选参数。如果你在函数调用期间没有指定参数,则quoteID的值可以是-1,否则它将具有不可为空的值。如果传递null,则编译器将给出错误。如果你不引用ID来保持空值,那么你的函数签名应该如下所示

    [HttpGet]
[ActionName("GetBillingInfo")]
public BillingInfo GetBillingInfo(string kValue = "", int? quoteID = -1)
{
    return _Repository.GetBillingDetails(kValue, quoteID);
}

答案 2 :(得分:0)

这称为optional parameters。它只是意味着如果此方法的调用者不为这些参数提供值,那么将使用提供给参数的默认值。

答案 3 :(得分:0)

其可选参数,如果您将值传递给int quoteID,它将保留该值,否则,它将是默认值-1

您可以通过4种方式调用您的方法

GetBillingInfo();//No parametes (kValue,quoteID)
GetBillingInfo("kvalue"); // KValue
GetBillingInfo("KValue" , 20); // kvalue + quoteID

您可以使用paramName(命名参数)

来调用它
 GetBillingInfo(quoteID: 20) //quoteID

更新问题:如何创建可选参数

答案有问题

语法是

MethodName(DataType Param = <DefaultValue> , DataType Param2 = <DefaultValue>)

GetBillingInfo(string kValue = "", int quoteID = -1)

阅读Named and Optional Arguments (C# Programming Guide)