微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NET类加载器是否有工作的标准方法?

如何解决.NET类加载器是否有工作的标准方法?

| .NET类加载器是否有工作的标准方法? 说我编译这段代码
Option Strict On : Option Explicit On

Module Module1
    Sub Main()
        System.Diagnostics.Debug.WriteLine(\"Main\")
        Dim g = C.A
    End Sub
End Module

Public Class C
    Shared Sub New()
        System.Diagnostics.Debug.WriteLine(\"Init C\")
    End Sub
    Shared Property A As New A
End Class

Public Class A
    Shared Sub New()
        System.Diagnostics.Debug.WriteLine(\"Init A\")
    End Sub
    Public Sub New()
        System.Diagnostics.Debug.WriteLine(\"A Constructor\")
    End Sub
End Class
我可以保证编译后的代码(在所有已实现的平台中)具有以下输出吗?
Main
Init A
A Constructor
Init C
    

解决方法

        因为您使用的是构造函数而不是内联初始化,所以VB编译器不会用
beforefieldinit
标记类型,并且顺序是完全受控的。 但是,如果您编写了以下内容(使用内联初始化):
Option Strict On : Option Explicit On

Module Module1
    Sub Main()
        System.Console.WriteLine(\"Main\")
        Dim g = C.A
    End Sub
End Module
Public Class C
    Shared Function Narg() As A
        Dim alpha As New A
        System.Console.WriteLine(\"Init C\")
        Return alpha
    End Function
    Shared Property A As A = Narg()
End Class
Public Class A
    Shared Sub New()
        System.Console.WriteLine(\"Init A\")
    End Sub
    Public Sub New()
        System.Console.WriteLine(\"A Constructor\")
    End Sub
End Class
订单是不确定的。可以使用与原始代码相同的顺序,但是可以更早初始化
C
。实际上,在我的系统上,输出为:
Init A
A Constructor
Init C
Main
原因是现在
C
被标记为
beforefieldinit
。 无偿采摘:不,不保证您的原始代码具有该输出。在发行版本中,它将没有输出,因为有条件调用了output8ѭ。     ,        是的,调用静态和实例构造函数的顺序是语言规范的一部分。所有符合条件的编译器应为此程序发出相同的IL。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。