允许将私有常量用作公共方法的默认参数的理念是什么?

时间:2015-12-22 12:47:47

标签: c# .net default-parameters

令我惊讶的是,这个编译并运行:

class Program
{
    static void Main()
    {
        DoSomething();
    }

    private const int DefaultValue = 2; // <-- Here, private.

    public static void DoSomething(int value = DefaultValue)
    {
        Console.WriteLine(value);
    }
}

该方法是公开的,而默认值&#34;重定向&#34;到一个恒定的私有变量。

我的问题:

这个&#34;概念&#34;背后的想法是什么?

我的理解(直到今天)是,只有所有其他人参与&#34;元素也是公开的。

更新

我只是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);
    }
}

因此,如果将私有常量作为默认参数在例如一个库,库的用户仍然可以看到默认参数。

4 个答案:

答案 0 :(得分:8)

  

这个“概念”背后的想法是什么?

这个想法是因为const值是静态的并且永远不会改变 - 您可以将它用作方法的可选参数的默认值,就像使用普通值一样。来自MSDN的引用:

每个可选参数都有一个默认值作为其定义的一部分。如果没有为该参数发送参数,则使用默认值。默认值必须是以下类型的表达式之一:

  • 一个常量表达式;

  • 新形式ValType()的表达式,其中ValType是一个值 类型,例如枚举或结构;

  • 表单default(ValType),其中ValType是一个值 类型。

  

我的理解(直到今天)是,公共事物只能是   如果所有其他“引用”元素也是公共的

,则使用

从技术上讲,这是正确的。但是在你的场景中,两个成员都是可访问的,因为它们在同一个类中被定义,但是在我们的例子中const应该在类Program之外定义,它在类Program内是不可访问的。< / p>

答案 1 :(得分:5)

使用const时,编译器会将所有出现的变量替换为实际值,因此您的代码与此相同:

public static void DoSomething(int value = 2)

答案 2 :(得分:5)

常量变量在编译时被替换,因此它们从未真正存在于生成的程序集中。所以使用常量的代码与直接使用常量值完全相同。好处是您可以在其他地方重用常量,只需要在一个位置更改它。

现在,由于常量在编译时总是被替换,因此将它们设置为public或private的效果也很简单:它只影响其他类型在编译时可以访问它的内容。因此,如果您只想将常量保持为当前类型,那么使用私有常量会很有用,而公共常量可以在整个应用程序中使用。

答案 3 :(得分:5)

名称DefaultValue是私密的,但号码2仍然是数字2

由于DefaultValue是私密的,我们无法从Program.DefaultValue之外访问Program。大概我们不会特别想要。

因为我们根本无法定义DefaultValue,所以当我们研究Program的工作方式时,我们可能会关心这一点。

因此,当我们为DoSomething定义默认值时,可能会出现一些逻辑上的原因,为什么我们想要的值恰好与值DefaultValue相同。

因此,能够在那里使用那个常数可能是有益的,原因与我们在任何地方找到有益的常数一样。

由于DefaultValue只是一种Program特定的2方式,因此我们没有理由不这样做。

当然,元数据会将其反映为2而不是(对外部无意义)DefaultValue,但如果constpublic,那么元数据就会成立无论如何(关于默认值的元数据只给出值,而不是它是否与任何已定义的常量相关)。

所以没有缺点。

所以考虑到:

  1. 实施者有一个优势。
  2. 除了使用文字2之外,对用户没有任何不利。
  3. 防止它必须引入一个特殊规则作为规则的例外,定义的常量可以在文字的常量值的任何地方使用。
  4. 为什么不呢?