什么';s允许私有常量用作公共方法的默认参数背后的想法

本文关键字:方法 默认 参数 背后 常量 许私 什么 | 更新日期: 2023-09-27 18:27:40

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

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);
    }
}

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

什么';s允许私有常量用作公共方法的默认参数背后的想法

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

其思想是,由于const值是静态的,并且永远不会改变——您可以将其用作方法可选参数的默认值,就像您可以使用正常值一样。MSDN引用:

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

  • 常量表达式;

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

  • 默认形式(ValType)的表达式,其中ValType是一个值类型


我(直到今天)的理解是,公开的东西只能是如果所有其他"引用"元素也是公共,则使用

从技术上讲,这是正确的。但在您的场景中,两个成员都是可访问的,因为它们是在同一个类中定义的。但是,如果在Program类之外定义const,则在Program类内部是不可访问的。

名称DefaultValue是私有的,但编号2仍然是编号2

因为DefaultValue是私有的,所以我们不能从Program之外访问Program.DefaultValue。大概我们不会特别想。

因为我们一直在努力定义DefaultValue,所以当我们研究Program如何工作时,这可能是我们关心的问题。

因此,当我们定义DoSomething的默认值时,我们想要的值恰好与DefaultValue的值相同,这大概是有一些逻辑原因的。

因此,能够在那里使用常数可能是有益的,原因与我们在任何地方都发现常数有益的原因大致相同。

由于DefaultValue只是Program特定的2表达方式,所以我们没有真正的理由不能这样做。

当然,元数据会将其反映为2,而不是(对外界来说毫无意义的)DefaultValue,但如果const无论如何都是public,则这一点会成立(关于默认值的元数据只给出值,而不是它是否与任何定义的常量相关)。

所以没有负面影响。

因此,考虑到这一点:

  1. 实现者有一个优势
  2. 这对用户来说没有任何不利之处,只不过是使用了一个文字2
  3. 要阻止它,就必须引入一条特殊规则,使其成为定义的常量可以在任何地方使用的规则的例外

为什么不呢?

当您使用const时,编译器会用实际值替换所有出现的变量,因此您的代码如下所示:

public static void DoSomething(int value = 2)

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

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