我發現C#中的這個特性「命名參數」非常奇怪,因爲我發現它有兩個缺陷。書上說的「命名參數給你‘來傳遞參數以任意順序的能力’使用C#「命名參數」的實際原因
兩個缺點,我認爲是這個C#功能的一個問題:
它違反了‘信息隱藏’在計算機科學 (即:使用該方法的最終用戶需要知道參數名稱和數據類型才能使用該功能)。從Java背景來看,這很奇怪。爲什麼要將參數名稱展示給用戶的最後?
它容易產生歧義,可能導致錯誤 (程序當程序員編寫使用相同方法名稱的方法(又稱重載方法)時,ammer需要做額外的思考和問題。你總是會得到一個「調用是模棱兩可的,當你有兩個相同名稱的方法時,即使另一個方法有不同數據類型的額外參數,我們可以想到的唯一的修復方法是使數據沒有默認值鍵入「強制參數」又名一個參數,這樣編譯器不會混淆。但後來此修復程序只是一個繃帶解決導致另一個最壞的情況(見下文)
做的人在行業中甚至會使用這個概念到現在呢?如果是這樣,爲什麼打破兩個規則給予「調用方法時按任意順序傳遞參數的能力」?
TLDR:一個例子,以澄清什麼我是 通過引入一個可能的最壞的情況下談論(編譯器選擇了錯誤的方法調用......儘管這兩種方法的相似):
namespace ConsoleApplication1
{
class Venusaur
{
static void Main(string[] args)
{
new Venusaur().optMethod(fourth: "s");
}
public void optMethod( string third , string fourth = "hello", int fifth = 23, string two = "w")
{
// what if I wanted this method to run instead of the method below me
Console.WriteLine("did not execute");
}
public void optMethod(string third = "Byte", string fourth = "hello", int fifth = 4)
{
// But this method ran instead
Console.WriteLine("run");
}
}
}
如果您想運行'optMethod'的第一個聲明,您需要明確指定'third'變量:'new Venusaur()。optMethod(「thirdStr」,fourth:「s」);' –
'我不確定這個問題是否會在主題上考慮。但是,要回答你的問題:使用命名參數是非常不尋常的,儘管它在C#中是允許的。我記得的唯一一個真實世界的例子是XNA和MonoGame(它看起來醜陋而古怪,我認爲它們可以做得更好)。 –
@jsve明確指定第三個變量將不起作用,因爲兩個方法的參數名稱相同,所以編譯器會感到困惑。它會產生「模糊方法調用錯誤」。我已經試過這個代碼:new Venusaur()。optMethod(third:「thirdStr」,fourth:「s」);不太清楚你如何「突出顯示你的代碼」以獲得回覆和答覆。 – Nicholas