本文来聊聊 MSIL 的基础知识,给一个 C# 的类标记了 static 之后和标记 static 之前,生成这个类的 IL 代码有什么不同

如以下的代码是一个默认的控制台程序

    class Program
{
static void Main(string[] args)
{
}
}

此时生成的 IL 代码,大概如下

.class private auto ansi beforefieldinit KakawbaijairKacheberelere.Program
extends [System.Runtime]System.Object

而如果给 Program 加上静态,如以下代码,生成的 IL 代码是和之前不相同的

    static class Program
{
static void Main(string[] args)
{
}
}

生成的 IL 代码如下

.class private abstract sealed auto ansi beforefieldinit
KakawbaijairKacheberelere.Program
extends [System.Runtime]System.Object

复习一下 IL 代码的知识

在 MSIL 里,采用 .class 表示这是类型的定义,类型定义的格式大概如下

.class [访问权限] [其他修饰] [命名空间].[类名] extends [继承的基类]

可以看到上下两个 IL 代码的不同在于,如果标记了 static 那 IL 将加上 abstract sealed 修饰。和 C# 代码的含义相同,通过 abstract 表示此类型不能被实例化,通过 sealed 表示此类型不能被继承。因此这就构成了静态类的特点,不能被创建实例,也不能被继承

MSIL 静态类在 IL 定义上和非静态类的差别的更多相关文章

  1. C# 静态类和非静态类的区别

    静态类和非静态类的区别 静态类: static       关键字 调用 类名.方法 在静态方法中只能访问静态成员  在静态类中只能有静态成员 在非静态类中 即可有非静态成员,也可以有静态成员 在静态 ...

  2. static静态类与非静态类的区别

    static静态类与非静态类的区别 1.在非静态类中可以有实例成员也可以有静态成员 2.在调用的时候需要使用对像名.实例成员调用(先要实例化,如person ps=new person();  ps. ...

  3. C# 静态类与非静态类、静态成员的区别

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  4. 深入理解C# 静态类与非静态类、静态成员的区别

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  5. 转载 C#中静态类和非静态类比较

    转载原地址: http://www.cnblogs.com/NothingIsImpossible/archive/2010/07/28/1786706.html C#静态方法与非静态方法的区别不仅仅 ...

  6. C#基础(七)——静态类与非静态类、静态成员的区别

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  7. C# 静态类与非静态类、静态成员的区别分析

    静态类静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化 ...

  8. 深入理解C# 静态类与非静态类、静态成员的区别 [转载]

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  9. 关于C++中的非静态类成员函数指针

    昨天发现了一个问题,就是使用对类中的非静态成员函数使用std::bind时,不能像普通函数一样直接传递函数名,而是必须显式地调用&(取地址),于是引申出我们今天的问题:非静态类成员函数指针和普 ...

  10. SQL Server 2014,表变量上的非聚集索引

    从Paul White的推特上看到,在SQL Server 2014里,对于表变量(Table Variables),它是支持非唯一聚集索引(Non-Unique Clustered Indexes) ...

随机推荐

  1. Java CC链全分析

    CC链全称CommonsCollections(Java常用的一个库) 梦的开始CC1 环境部署 JDK版本:jdk8u65 Maven依赖: <dependencies> <!-- ...

  2. python 写的随机抽奖小程序实现批量抽奖功能

    设计思路: 1:导入EXCEL文件中,含有ID,Name两个字段的文件数据做为抽奖池 2:设置奖项,可自定义,放在.txt文件中去读取出来就可以 3:实现单轮可以抽多个名单的功能, 4:保存为.csv ...

  3. cadence软件画版图操作

    cadence软件操作 1.原理图设计 电路的原理图设计和许多的电路设计软件是类似的,这里大致介绍一下基本的操作. 首先是新建一个cell的原理图: library manager>file&g ...

  4. redis的两种持久化方式

    1.为什么redis需要持久化 答:edis是基于内存的,如果Redis服务器挂了,数据就会丢失 2.有几种方式实现redis的持久化 答:有两种,一种是AOF 持久化,另一种是RDB持久化 一. A ...

  5. Refresh 重构(Refactor)

    最近在闲暇之余重(第)温(一..次)此书, 首先能感受到的, 无论你是新程序员还是老程序员, 这本书都已经不具备太多的可读性了. 由于本书成书年代久远, 那个时候软件行业还不够发达, 面向对象还没有被 ...

  6. #dp#洛谷 4158 [SCOI2009]粉刷匠

    题目 分析 首先每条木板可以分开处理,再合并起来求最大值 下面讲一下单独处理每条木板的情况 设\(dp[k][m]\)表示前\(m\)个格子粉刷了\(k\)次最多正确粉刷的格子数 那么 \[dp[k] ...

  7. reactive stream协议详解

    目录 背景 什么是reactive stream 深入了解java版本的reactive stream Publisher Subscriber Subscription Processor JDK中 ...

  8. 带你玩转OpenHarmony AI-基于海思NNIE的AI能力自定义

    简介 相信大家从玩转OpenAtom OpenHarmony(简称"OpenHarmony")AI系列专题的其他文章中,已经拓展了OpenHarmony AI在智慧出行.智慧办公等 ...

  9. 等个有“源”人|OpenHarmony 成长计划学生挑战赛报名启动

    OpenAtom OpenHarmony(以下简称"OpenHarmony)开源开发者成长计划-解决方案学生挑战赛(以下简称"本大赛"或"成长计划学生挑战赛&q ...

  10. 【直播回顾】参与文档贡献,开启OpenHarmony社区贡献

      5月25日晚上19点,战"码"先锋第二期直播 <参与文档贡献,开启OpenHarmony社区贡献> ,在OpenHarmony社群内成功举行.   本期课程,由华为 ...