zoukankan      html  css  js  c++  java
  • c#原理:c#代码是怎么运行的、实例化时发生了什么、静态对象(类、方法、变量、属性)的原理

    c#代码是怎么运行的:

     c#代码=》编译器=》DLL/EXE=>CLR/JIT=>机器码

    最后到二进制的时候是这么执行的???

    要知道更具体细节,可以参考书籍《CLR VIA C#

    C#基础篇之C#和 .Net框架的概念和运行原理

    深度理解C# 的执行原理

    CPU(中央处理器) - 百度百科

     

    转自:c#编译后是怎么运行的

    1..NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。
    程序集要么是可执行的,要么是DLL
    程序集里的代码并不是本机代码,而是一种名称为CIL的中间语言
    程序集包含如下信息:
    程序的CIL
    程序中使用的类型的元数据
    对其他程序集引用的元数据
    2. 程序的编译过程
    程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面步骤:
    检查程序集的安全特性
    在内存中分配空间
    把程序集中的可执行代码发送给实时编译器(JIT),把其中的一部分编译成本机代码。
    程序集中的可执行代码只在需要的时候由JIT编译器进行编译,然后它就被缓存起来以备在后来的程序中执行。这就意味着不被调用的代码不会被编译成本机代码,而且被调用的代码只被执行一次。
    一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行像内存释放、数组边界检查、检查参数类型、异常管理等任务。有两个重要的术语由此而生。
    托管代码:为.NET框架编写的代码称为托管代码,需要CLR
    非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL,称为非托管代码
    当您的C#代码编译后.他会变成EXE 此时会被编译为中间语言.通过.NET框架进行执行语句

    实例化时发生了什么:

    实例化创建对象

    AA b new=AA()

    使用AA类声明创建爱了一个 a 变量,也可以用var代替AA,如:var x=new AA()

    AA()的时候调用了XX类的默认无参构造函数,如果使用AA(参数)会调用对应有参数的构造函数

    实例化类执行顺序:静态==》实例==》构造, 不管有没有基类,本类的构造函数都是最后执行的,执行到基类的时候基类的构造函数也是最后执行的。

    注意:实例化类时,只有在类的一级目录下的实例才会被执行,如果在没有被调用的方法的实例,是不会执行的

    不含基类的执行顺序:静态对象==》实例成员==>构造函数

    1. 静态字段被实例化。
    2. 静态构造函数被调用。
    3. 实例成员字段被实例化。
    4. 对象构造函数被调用。

    包含基类的执行顺序:本类静态对象、实例成员==》基类静态对象、构造函数==》本类构造函数

    1. 本类静态字段被实例化。
    2. 本类静态构造函数被调用。
    3. 本类实例成员字段被实例化。
    4. 基类静态字段被实例化。
    5. 基类静态构造函数被调用。
    6. 基类实例成员字段被实例化。
    7. 基类构造函数被调用。
    8. 本类构造函数被调用。

    参考

    实例化数组:

    静态对象(类、方法、变量、属性)的原理:

    静态对象是直接调用而不需要实例化的,

    实例化时静态对象是首先执行的

    值类型和引用类型,引用和调用、创建的区别???

    如有错误,欢迎您指出。
    本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    jmeter之正则表达式
    python_appium搭建APP自动化测试环境
    网络编程
    四种单例模式
    Pycharm快捷键
    面向对象
    阶段性总结
    模块之numpy,pandas,matplotlib
    模块之json,pickle,os,sys,logging
    模块之Time,datatime,hashlib,hmac
  • 原文地址:https://www.cnblogs.com/qingyunye/p/12485000.html
Copyright © 2011-2022 走看看