簡體   English   中英

命名參數與可選參數

[英]Named Parameters vs Optional Parameters

可選參數在C#中並不是什么新鮮事物,自C#5.0發布以來,我就已經知道了這一點,但是我剛剛遇到了一些問題。 當我為MVC模型使用數據注釋(例如Required屬性)時,會看到以下內容:

在此處輸入圖片說明

所以我可以做:

[Required(ErrorMessage="Something"]

但是,當我使用可選參數創建自己的方法時,例如:

void Test(String x = null, String y = null) {}

我可以通過以下兩種方式傳遞參數:

Test(x = "Test") OR Test(x: "Test")

Required屬性中,我總是必須使用= ;如果使用: ,它將導致錯誤。 例如:

 Required(ErrorMessage:"Something") --> Compile time error

因此,我看到的是這些命名參數的創建方式與我已經知道的方式不同。 我的問題是如何使它們成為一種方法(如何在Required屬性中創建此類命名參數)。

屬性具有自己的語法。 它對命名參數使用name=value形式。

對於通常的方法,您不能使用該形式,但是會被name:value形式所困擾。

普通方法不可能使用name=value形式。 編譯器將無法告訴您是要使用命名參數還是將值賦給變量並將賦值用作參數值。

盡管此語法看起來像方法調用:

[Required(ErrorMessage="Something")]

屬性是 ,而不是方法。 您沒有在上面的行中指定參數,而是在初始化屬性。 請參閱Attribute基類文檔上的示例,以了解我的意思。

因此,指定屬性的語法類似於C#的類初始化語法:

new RequiredAttribute { ErrorMessage = "Something" };

當前在C#中沒有用於為方法指定命名參數的等效語法。

如果您執行以下操作:

string y; 
Test(y = "Test")

您可以使用該語法調用函數。 但是要小心... y = "Test"實際上是在設置變量y ,然后將其傳遞給函數! 有一個副作用,這可能是不希望的。 同樣, "Test"也被傳遞給Test函數的參數x ,而不是y因為它作為第一個參數進入。

簡而言之,在調用函數時,應始終避免使用此語法,因為它不能滿足您的期望。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM