Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果在声明中为参数指定了一个值,该值何时适用?_C# - Fatal编程技术网

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

C# 如果在声明中为参数指定了一个值,该值何时适用?,c#,C#,在声明中初始化参数意味着什么 我最近很惊讶地看到了这段代码。 quoteId何时为-1?总是如果它作为null?传入,是否省略 [更新] 答案是,为参数指定一个值会导致该参数是可选的 这个问题与询问如何创建可选参数相反 这就是所谓的。这仅仅意味着,如果此方法的调用方没有为这些参数提供值,则将使用提供给这些参数的默认值。其可选参数,如果将值传递给int quoteID,它将保留该值,否则,它将是默认值-1 您将能够通过4种方式调用您的方法 GetBillingInfo();//No paramet

在声明中初始化参数意味着什么

我最近很惊讶地看到了这段代码。 quoteId何时为-1?总是如果它作为null?传入,是否省略

[更新]

答案是,为参数指定一个值会导致该参数是可选的


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

这就是所谓的。这仅仅意味着,如果此方法的调用方没有为这些参数提供值,则将使用提供给这些参数的默认值。

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

您将能够通过4种方式调用您的方法

GetBillingInfo();//No parametes (kValue,quoteID)
GetBillingInfo("kvalue"); // KValue
GetBillingInfo("KValue" , 20); // kvalue + quoteID
您可以使用paramName(命名参数)调用它

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

答案有疑问

语法是

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

GetBillingInfo(string kValue = "", int quoteID = -1)
MethodName(数据类型Param=,数据类型Param2=)
GetBillingInfo(字符串kValue=“”,int quoteID=-1)

读取

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

    [HttpGet]
[ActionName("GetBillingInfo")]
public BillingInfo GetBillingInfo(string kValue = "", int? quoteID = -1)
{
    return _Repository.GetBillingDetails(kValue, quoteID);
}
该概念称为“默认值”,允许使用不同的概念“可选参数”

简单地说,如果调用该方法并且没有提供指定的参数,将使用其默认值

但是它是什么意思呢

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

  • 对不提供此参数的此方法的调用最终将使用编译到被调用方法中的默认值
  • 对不提供此参数的此方法的调用将传入编译调用它的代码时声明的默认值
  • 那是哪一个呢

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

    public void Test(int value = 42)
    {
    }
    

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

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

    换句话说,第二段代码被视为是这样编写的:

    public void SomeOtherTest()
    {
        SomeInstance.Test(42); // this is the same Test as above
    }
    
    注意此处参数调用中的附加
    42

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

  • 可以在对该方法的调用中输入具有默认值的参数
  • 这样的调用,其中参数是ommitted,将被编译,就像参数值一直在那里一样,带有该参数的默认值
  • 为什么这很重要

    嗯,考虑上面两段代码是否存在于两个不同的项目中,从而编译成两个不同的程序集,DLL的

    如果稍后更改声明该方法的项目的源代码以提供不同的默认值,则另一个项目仍将编译为提供42


    除非调用的另一个程序集被重新编译,否则值
    42
    仍将传递给该方法。

    读取可能的重复项请注意,为可选参数提供的值将在调用时编译到调用站点。换句话说,如果使用对
    GetBillingInfo
    的调用编译dll,其中包含该调用的源代码未提供
    quoteID
    ,则将传入值
    -1
    ,即使原始源代码更改为使用不同的值。默认值在编译时编译到调用站点的程序集中。如果默认值稍后更改,您将需要重新编译调用该方法的项目以获得新的默认值。Lasse Vågsæther Karlsen在其评论中所写的内容基本上回答了这个问题。另外,这也是我喜欢方法ovrrloading而不是可选参数的主要原因——因为如果默认值更改,您就不必担心编译使用您的类的所有内容
    public void Test(int value = 42)
    {
    }
    
    public void SomeOtherTest()
    {
        SomeInstance.Test(); // this is the same Test as above
    }
    
    public void SomeOtherTest()
    {
        SomeInstance.Test(42); // this is the same Test as above
    }