令我惊讶的是,这个编译并运行:
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);
}
}
因此,如果将私有常量作为默认参数在例如一个库,库的用户仍然可以看到默认参数。
答案 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
,但如果const
为public
,那么元数据就会成立无论如何(关于默认值的元数据只给出值,而不是它是否与任何已定义的常量相关)。
所以没有缺点。
所以考虑到:
2
之外,对用户没有任何不利。为什么不呢?