Cri*_*scu 12 c# java compiler-construction initialization
这段代码:
class C
{
int i = 5;
byte[] s = new byte[i];
}
Run Code Online (Sandbox Code Playgroud)
无法编译时出现以下错误:
字段初始值设定项不能引用非静态字段,方法或属性"Ci"
Resharper说类似的东西:无法访问i静态上下文中的非静态字段.
这与C#规范所说的一致 - 字段初始化程序无法访问当前正在创建的实例(this),或者通过扩展,访问任何实例字段:
实例字段的变量初始值设定项无法引用正在创建的实例.因此,在变量初始化程序中引用它是一个编译时错误,因为变量初始化程序通过简单名称引用任何实例成员是编译时错误.
但是,这在Java中运行得很好:
class C {
int i = 5;
byte s[] = new byte[i]; //no errors here
}
Run Code Online (Sandbox Code Playgroud)
在一个假设的世界中,这在C#中是有效的,我想知道:它甚至可能吗?如果是这样,它会增加到表中的利弊是什么?此外,由于它的真正Java语言支持,做同样的优点/缺点持有 的Java?或者类型初始化程序在两种语言中的工作方式有根本区别吗?
Eri*_*ert 13
简而言之,在构造函数体运行之前访问接收器的能力是边缘效益的特征,这使得编写错误程序更容易.因此,C#语言设计者完全禁用它.如果需要使用接收器,则将该逻辑放在构造函数体中.
至于为什么这个特性在Java中是合法的,你将不得不问一个Java设计师.
在C#中,字段初始化器仅仅是开发人员的便利语义.编译器将所有字段初始值设定项移动到构造函数ABOVE的主体中,其中对基础构造函数进行调用.因此,字段在祖先链上初始化,并且该类从基础向下初始化.
静态引用是可以的,因为它们先于其他任何东西进行初始化