上周末我遇到了一个开源项目,当时我碰到了一些代码,让我很困惑地查看了C#规范中的用法.
问题中的代码如下:
internal static class SomeStaticClass
{
private const int CommonlyUsedValue = 42;
internal static string UseCommonlyUsedValue(...)
{
// some code
value = CommonlyUsedValue + ...;
return value.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
我被猝不及防,因为这似乎是静态函数使用的非静态字段,有些如何在静态类中编译得很好!
规范声明(§10.4):
常量声明可以包括一组属性(§17),一个新修饰符(§10.3.4),以及四个访问修饰符的有效组合(§10.3.5).属性和修饰符适用于constant-declaration声明的所有成员.尽管常量被认为是静态成员,但常量声明既不需要也不允许使用静态修饰符.同一修饰符在常量声明中多次出现是错误的.
所以现在它更有意义,因为常量被认为是静态成员,但句子的其余部分对我来说有点令人惊讶.为什么常量声明既不需要也不允许使用静态修饰符?不可否认,我不知道这个规范是否足以让它立即变得有意义,但为什么决定不强制常量使用静态修饰符如果它们被认为是静态的?
查看该段落中的最后一句,我无法弄清楚它是否直接与前一个语句有关,并且在常量上有一些隐式静态修饰符,或者它是否作为常量的另一个规则.任何人都可以帮我解决这个问题吗?
看来我需要在使用C#的switch语句中的每个case块中使用break.
我可以在其他语言中看到这个原因,您可以通过下一个案例陈述.
案例块是否可能落入其他案例块?
非常感谢,非常感谢!
考虑:
class Foo
{
static Foo()
{
// Static initialisation
}
}
Run Code Online (Sandbox Code Playgroud)
为什么()需要static Foo() {...}?静态构造函数必须始终是无参数的,为什么要这么麻烦?它们是否有必要避免一些解析器歧义,或者只是为了保持与常规无参数构造函数的一致性?
由于它看起来非常像初始化块,我经常发现自己意外地将它们排除在外,然后不得不考虑几秒钟的错误.如果他们可以以同样的方式被淘汰将是很好的.