• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#小知识之有趣的类型静态构造器

C#小知识之有趣的类型静态构造器

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#静态构造函数,c#中静态构造函数,c#静态类,c#静态变量,c#静态方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

这是C#中一个有趣的现象,也许您从中可以窥见些许CLR在构造类型时的行为,以及JIT编译的触发式编译过程。

看下面一段代码:
class Program
    {
        static void Main()
        {
            myValueType1 type1 = new myValueType1();
            Console.WriteLine(myValueType1.myInt);
            Console.WriteLine("**********************");
            myValueType2 type2 = new myValueType2();
            type2.myInt =23;
            Console.WriteLine(type2.myInt);
            Console.WriteLine("**********************");
            myValueType3 type3 = new myValueType3();
        }
    }

    struct myValueType1
    {
        static myValueType1()
        {
            Console.WriteLine("Hello from myValueType1");
           // myInt = 111;
        }
        public static Int32 myInt;
    }

    struct myValueType2
    {
        static myValueType2()
        {
            Console.WriteLine("Hello from myValueType2");
        }
        public Int32 myInt;
    }

    struct myValueType3
    {
        static myValueType3()
        {
            Console.WriteLine("Hello from myValueType3");
            myInt = 333;
        }
        public static Int32 myInt;
    }
</div>

这里定义了三个结构:myValueType1,myValueType2,myValueType3。三个结构均带静态构造器,在构造器中都有一句用来输出的的代码。在myValueType1和myValueType3的静态。然后我们在main函数里面分别new 了相应的三个实例。您可以先想想输出的结果应该是怎样的。
 事实上您会得到如下的结果:

 我们看到虽然三个结构中都有静态构造器,却只有第一个结构的被执行了。事实上,这个有趣的现象也是CLR对性能的考虑,除非类型确实被访问到了,否则永远不会调用到它的类型构造器,这个过程是JIT的。

当执行到第六行代码时,CLR尝试要去myValueType1查找静态字段myInt的值。这个时候,myValueType1才是真正被访问到了。静态构造器被执行,得到相应的输出。
而myValueType2中myInt是个实例成员,访问它的值只关系到实例type2实例。与类型本身没有任何关系,CLR不会执行类型myValueType2的静态构造器。

myValueType3跟myValueType11几乎是一样的,myInt是静态成员,但是在main函数中,myValueType3还是没有被真正访问到,只是利用它构造出了一个虚拟的对象结构,这种对象结构里面所有字段都被赋予一个0值或者null值,所以第二行输出为零
这些性质与JIT编译器都是分不开的。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#小知识之有趣的类型静态构造器
  • C#生成单页静态页简单实例
  • C#中私有构造函数的特点和用途实例解析
  • C#中静态构造函数的几点说明介绍
  • C# 静态构造函数使用总结
  • c# 引用类型构造器

相关文章

  • 2017-05-28C#中结构(struct)的部分初始化和完全初始化实例分析
  • 2017-05-28C#中派生类调用基类构造函数用法分析
  • 2017-05-28C# 设置系统日期格式的方法
  • 2017-05-28C#中的位操作小结
  • 2017-05-28C#实现最简单的文本加密方法
  • 2017-05-28c# 实现IComparable、IComparer接口、Comparer类的详解
  • 2017-05-28浅谈C# 中的可空值类型 null
  • 2017-05-28C#中字符串的加密的源码
  • 2017-05-28C#中WinForm控件的拖动和缩放的实现代码
  • 2017-05-28使用C#发送Http请求实现模拟登陆实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#编程获取资源文件中图片的方法
    • C# winfrom 模拟ftp文件管理实现代码
    • c#并行任务多种优化方案分享(异步委托)
    • C#浅拷贝和深拷贝实例解析
    • vs2005中总是保留最近打开的项目和文件的记录
    • C#调用dos窗口获取相关信息的方法
    • 深入理解C# DateTime日期格式化
    • Winform基于多线程实现每隔1分钟执行一段代码
    • 在Linux上运行C#的方法
    • C#用户定义类型转换详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有