什么';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);
}
}
因此,如果在例如库中使用私有常量作为默认参数,则库的用户仍然可以看到默认参数。
这个"概念"背后的想法是什么?
其思想是,由于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
,则这一点会成立(关于默认值的元数据只给出值,而不是它是否与任何定义的常量相关)。
所以没有负面影响。
因此,考虑到这一点:
- 实现者有一个优势
- 这对用户来说没有任何不利之处,只不过是使用了一个文字
2
- 要阻止它,就必须引入一条特殊规则,使其成为定义的常量可以在任何地方使用的规则的例外
为什么不呢?
当您使用const时,编译器会用实际值替换所有出现的变量,因此您的代码如下所示:
public static void DoSomething(int value = 2)
常量变量在编译时被替换,因此它们从未真正存在于生成的程序集中。因此,使用常量的代码实际上与直接使用常量值完全相同。好处是您可以在其他地方重用常量,只需要在一个位置更改它。
现在,由于常量总是在编译时被替换,所以将它们设为公共或私有的效果也很简单:它只会影响其他类型在编译时可以访问它的内容。因此,如果您只想将私有常量保持为当前类型,那么使用私有常量可能会有所帮助,而公共常量可以在整个应用程序中使用。