令我惊讶的是,这个编译并运行:
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.DefaultValue
从外面访问Program
.大概我们不会特别想要.
而且因为我们根本无法定义DefaultValue
,所以当我们研究工作方式时,我们可能会关心它Program
.
因此,当我们定义一个默认值时,DoSomething
可能有一些逻辑上的原因,为什么我们想要的值恰好与值相同DefaultValue
.
因此,能够在那里使用那个常数可能是有益的,原因与我们在任何地方都能找到有益的常数一样.
而且,由于DefaultValue
这只是一种Program
特定的说法2
,我们没有理由不这样做.
当然,元数据将反映这个作为2
,而不是(无意义的外)DefaultValue
,但随后将举行,如果const
是public
无论如何(关于默认值的元数据,只给出了价值,而不是它是否与任何定义的常量) .
所以没有缺点.
所以考虑到:
实施者有一个优势.
用户没有任何不利,只是使用文字2
.
防止它必须引入一个特殊规则作为规则的例外,定义的常量可以在文字的常量值的任何地方使用.
为什么不?