簡體   English   中英

將私有常量用作公共方法的默認參數背后的想法是什么?

[英]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的(關於默認值的元數據僅給出值,而不是它是否與任何已定義的常量)。

所以沒有缺點。

所以考慮到:

  1. 實施者有一個優勢。
  2. 用戶沒有任何缺點,只使用文字2
  3. 防止它必須引入一個特殊規則作為規則的例外,定義的常量可以在文字的常量值的任何地方使用。

為什么不?

暫無
暫無

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

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