[英]What's the idea behind allowing private constant to be used as default parameters for public methods?
令我驚訝的是,這個編譯並運行:
class Program
{
static void Main()
{
DoSomething();
}
private const int DefaultValue = 2; // <-- Here, private.
public static void DoSomething(int value = DefaultValue)
{
Console.WriteLine(value);
}
}
該方法是公共的,而默認值“重定向”到常量私有變量。
我的問題:
這個“概念”背后的想法是什么?
我的理解(直到今天)是,只有所有其他“引用”元素也是公開的,才能使用公共事物。
更新:
我只是ILSpy反編譯我的課找到:
static class Program
{
private static void Main()
{
Program.DoSomething(2);
}
private const int DefaultValue = 2;
public static void DoSomething(int value = 2)
{
Console.WriteLine(value);
}
}
因此,如果私有常量作為默認參數在例如庫中完成,則庫的用戶仍然可以看到默認參數。
這個“概念”背后的想法是什么?
這個想法是因為const
值是靜態的並且永遠不會改變 - 你可以將它用作方法的可選參數的默認值,就像使用普通值一樣。 來自MSDN的引用:
每個可選參數都有一個默認值作為其定義的一部分。 如果沒有為該參數發送參數,則使用默認值。 默認值必須是以下類型的表達式之一:
一個恆定的表達;
表達式為新的ValType(),其中ValType是值類型,例如枚舉或結構;
形式為default(ValType)的表達式,其中ValType是值類型。
我的理解(直到今天)是,只有所有其他“引用”元素也是公開的,才能使用公共事物
從技術上講,這是正確的。 但是在你的場景中,兩個成員都是可訪問的,因為它們是在同一個類中定義的,但是在我們的例子中, const
應該在類之外定義Program
它在類Program
是不可訪問的。
當您使用const時,編譯器會將所有出現的變量替換為實際值,因此您的代碼與此相同:
public static void DoSomething(int value = 2)
常量變量在編譯時被替換,因此它們從未真正存在於生成的程序集中。 所以使用常量的代碼與直接使用常量值完全相同。 好處是您可以在其他地方重用常量,只需要在一個位置更改它。
現在,由於常量在編譯時總是被替換,因此將它們設置為public或private的效果也非常簡單:它只影響其他類型在編譯時可以訪問它的內容。 因此,如果您只想將常量保持為當前類型,則使用私有常量可能會有所幫助,而公共常量可以在整個應用程序中使用。
名稱DefaultValue
是私有的,但數字2
仍然是數字2
。
由於DefaultValue
是私有的,因此我們無法從Program
外部訪問Program.DefaultValue
。 大概我們不會特別想要。
而且因為我們根本無法定義DefaultValue
,所以在我們研究Program
工作原理時,我們可能會關心它。
因此,當我們為DoSomething
定義默認值時,可能有一些邏輯上的原因,為什么我們想要的值恰好與值DefaultValue
相同。
因此,能夠在那里使用那個常數可能是有益的,原因與我們在任何地方都能找到有益的常數一樣。
而且由於DefaultValue
只是一種特定於Program
的說法2
,所以我們沒有真正的原因。
當然,元數據會將其反映為2
而不是(對於外部無意義) DefaultValue
,但是如果const
無論如何都是public
的(關於默認值的元數據僅給出值,而不是它是否與任何已定義的常量)。
所以沒有缺點。
所以考慮到:
2
。 為什么不?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.