惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
有赞技术团队
有赞技术团队
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
B
Blog RSS Feed
博客园_首页
Y
Y Combinator Blog
V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence
雷峰网
雷峰网
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Help Net Security
P
Proofpoint News Feed
B
Blog
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - 追忆似水年华

dotNet平台下的SNS软件的比较与选用(一) 对于IM市场的思考 杂谈DNN - 追忆似水年华 - 博客园 点评顾雏军 - 追忆似水年华 - 博客园 我要开始研究DNN了 关于《民工》 张纪中 vs 管虎 呵呵,msn7的端口修改了。 C#实现的根据年月日计算星期几的函数 记得有人说过,人生有两大欢乐,一是拥有后可以细细品味,二就是追求之中的备感充实。 install sheild调用外部函数(在dll内) 谁用过 install shield x 呀,我遇到麻烦了. 不好意思 又来问问题了. 忽然想起了刘伶 忽然想起我读书时 写的两句话 用vs制作安装程序的时候 如何获取用户输入的序列号,并进行判定 关于向页面注册javascript的技术 关于键盘模拟的问题 我读《Microsoft .NET框架程序设计(修订版)》------DoItNow的读书笔记6 发现了MSDN的两个错误 不知道大家的看法如何
我读《Microsoft .NET框架程序设计(修订版)》------DoItNow...
追忆似水年华 · 2004-07-02 · via 博客园 - 追忆似水年华

这个问题前些天 与很多人都讨论过. 其中吴海鹏的结论是 const定义的常量是属于类型的 而readonly定义的只读变量是属于 实例的. "框架编程"则本书上 也有对此问题的 说明. 下面我将通过代码 及其编译后的IL 阐述一些这个问题.

当把上面的代码编译后 查看MSIL

可以看到定义为const的myName在IL中变成了一个static的字符串了, 静态的东西是属于类型的.而定义为readonly的myScholl是属于对象的 (吴海鹏说的是正确的:))

在上面的代码中 我在加一句 静态的变量myGame如下:

在看编译后的MSIL的情况

可以看到除了增加了一个静态的变量myGame外,csc编译器还自动增加了一个类型构造器(.cctor---class constructor). 打开此类型构造器看到IL如下:

.method private hidebysig specialname rtspecialname static
        void  .cctor() cil managed
{
  // 代码大小       11 (0xb)
  .maxstack  1
  IL_0000:  ldstr      "footBall"
  IL_0005:  stsfld     string xieran.Test.myClass::myGame
  IL_000a:  ret
} // end of method myClass::.cctor

也就是说在代码中声明的静态字段 是在类型构造器中初始化的, 声明的const显然没有在类型构造器中初始化.

在myName上双击打开其代码 为
.field private static literal string myName = "Liuxd"
在myGame上打开其代码为
.field private static string myGame
也就是说常量是在编译时确定其值的. 各种变量(包括static变量)是在运行时 通过构造器(实例构造器或类型构造器)进行初始化的. 常量在编译后其值是放在模块的元数据中的. 同时由于常数是在编译时初始化,所有其 能够支持的数据类型也是有限的(其类型必须是编译器认识的“基元类型“如Int32,String等,至于其他的各种类型就不支持了).