c# - 编译器可以在变量实际启动之前为变量赋值吗?

标签 c# java vb.net compiler-construction initialization

我刚读过 http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html?page=5它说:

the compiler is free to assign a value to the singleton member variable before the singleton's constructor is called

请问是不是打错了。他们真的真的想说:JVM 的实现是免费的而不是编译器是免费的

我的第二个问题是 C#/VB 也有这个问题吗? (其中“编译器”可以自由地为变量赋值,甚至在变量完全启动之前/甚至在变量类的构造函数完全运行之前。

最佳答案

在Java中,为对象分配内存和调用构造函数是两个独立的操作。例如,类似

Object o = new Object();

编译成这些字节码:

0:  new #2; //class java/lang/Object
3:  dup
4:  invokespecial   #1; //Method java/lang/Object."<init>":()V
7:  astore_1

在指令 0 之后,对已分配但未构造的对象的引用位于堆栈上。直到偏移量 4 才调用构造函数。绝对没有什么可以阻止编译器将该引用分配给它想要的任何变量,包括静态成员。因此,这篇文章是正确的。

我不知道 CLR 字节码,但我想它与 JVM 的指令集相当接近,而且我猜想该运行时也会存在与线程相关的相同类型的警告。它当然适用于 native 代码编译器。

关于c# - 编译器可以在变量实际启动之前为变量赋值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944601/

相关文章:

java - 为什么ExecutorService方法invokeAny()在每次运行的程序上都处理不同数量的任务?

vb.net - 使用 Json 解析而不是 XML 解析。 VB网络

asp.net - 奇怪的 ASP.Net 错误 : .net 4.6.1,VS2015 - 不支持内插字符串?

c# - LINQ OrderBy 排序不正确

c# - WPF ListView 与 DataGrid 性能

java - tomcat dbcp _closed PoolableConnection 但处于已分配状态

java - 如何解析 XML 标签中的换行符?

c# - 创建 HttpClient 后,我​​可以更改 HttpClientHandler 的属性吗?

c# - QueryOver 错误 : Unrecognised method call in expression value

c# - WPF C# 数据网格对象引用未设置为对象的实例