定义常量符号时,它的值必须能在编译时确定。确定之后,编译器将常量的值保存到程序集的元数据中。这意味着只能为编译器认定的基元类型定义常量。在C#中,以下类型都是基元类型,可以定义常量:Boolean、Char、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Decimal、String。
由于常量的值从不变化,所以常量总被视为类型定义的一部分。换言之,常量总被视为静态成员。
代码引用一个常量符号时,编译器会在定义常量的程序集的元数据中查找该符号,提取常量的值,并将值嵌入生成的IL代码中。由于常量的值直接嵌入代码,所以在运行时不需要为常量分配任何内存。
将一下代码编译成一个DLL程序集
public sealed class SomeLibraryType{
public const Int32 MaxEntriesInList=50; //常量总是隐式为static
}
然后再生成一个应用程序程序集
public sealed class Program{
public static void Main(){
Console.WriteLine(SomeLibraryType.MaxEntriesInList);
}
}
编译器在生成应用程序代码时,会注意到MaxEntriesInList是一个值为50的常量符号,所以会将Int32值50嵌入应用程序的IL代码中。所以在生成应用程序程序集之后,运行时根本不会加载DLL程序集,可以把它从磁盘上删除。
这个例子清晰的展示了版本控制的问题,如果开发人员将MaxEntriesInList的值更改为1000,并且只重新生成DLL程序集,那么应用程序程序集不会受到任何影响。应用程序要获得新值,也必须重新编译。 如果希望在运行时从一个程序集提取另一个程序集中的值,那么不应该使用常量,而应该使用readonly字段。
将上述DLL程序集改成如下
public sealed class SomeLibraryType{
public static readonly Int32 MaxEntriesInList=50; //此处使用static是为了字段和类型关联
}
编译器在生成应用程序代码时,会加载DLL程序集,然后从分配给它的动态内存中提取MaxEntriesInList字段的值,而这时将不用重新编译应用程序程序集。
当某个readonly字段是引用类型时,那么不可以改变的是引用,而非字段引用的对象。
分享到:
相关推荐
CLR支持类型字段和实例字段 类型字段:用于容纳字段数据的动态内存是在类型对象中分配的, 而类对象是在类型加载到一个AppDomain中创建的。 通常是在引用该类型的任何方法首次进行JIT编译的时候。 实例字段:用于...
收缩器将删除所有r.class和r\$**.class,所有常量整型字段将由asm和transform api内联。
作为深受编程人员爱戴和尊敬的编程专家,微软.NET开发团队的顾问... 第7章 常量和字段 第8章 方法:构造器、操作符、转换操作符和参数 第9章 属性 第10章 事件 第Ⅳ部分 基本类型 第11章 字符、字符串和文本
作为深受编程人员爱戴和尊敬的编程专家,微软.NET开发团队的顾问,本书作者Jeffrey Richter针对... 第7章 常量和字段 第8章 方法:构造器、操作符、转换操作符和参数 第9章 属性 第10章 事件 第Ⅳ部分 基本类型
第7章 常量和字段 第8章 方法:构造器、操作符、转换操作符和参数 第9章 属性 第10章 事件第Ⅳ部分 基本类型 第11章 字符、字符串和文本 第12章 枚举类型和位标志 第13章 数组 第14章 接口 第15章 委托 第16...
第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作符重载方法 8.4.1 操作符和编程语言互操作...
第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作符重载方法 8.4.1 操作符和编程语言互操作性...
3.Const可以用在字段和局部变量,readonly只可以修饰字段 您可能感兴趣的文章:C#学习笔记整理_变量等基础语法(必看篇)C#把整个文件内容读入字符串变量的方法C#中static静态变量的用法实例C#不同类型的成员变量(字段...
第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作符重载方法 8.4.1 操作符和编程语言互操作...
第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作符重载方法 8.4.1 操作符和编程语言互操作...
类是一种数据结构,包含数据成员(常量和字段)、函数成员(方法、属性、事件、索引器、运算符、实例构造函数、静态构造函数和析构函数)以及嵌套类型。
主要介绍了c#只读字段和常量的区别,以及静态构造函数的使用实例,有需要的朋友可以参考一下
符号引用: 符号引用包括三种:类的全限定名,方法名和描述符,字段名和描述符。 Class文件常量池 运行时常量池 运行时常量池是在类加载阶段,将class二进制数据加载到内存, 并将数据保存到方法区,其中class文件中...
集成调试平台,支持类结构/jar结构预览、支持方法调试和监听、支持修改类字段(变量、常量、枚举)等。前端功能包括:文章列表、文章类别、站长/博主信息、最新/最热文章、分页、友情链接、文章详情等。后台功能包括:...
C#中,当使用常数符号const时,编译器首先从定义常数的模块的元数据中找出该符号,并直接取出常数的值,接下来详细介绍,感兴趣的朋友可以参考下
5.10 定义表头行的字段做常量字段 5.11 定义表头行的每个字段做为分开的字段 5.12 引用数据库字段 5.13 打印报表样本 5.14 重用以前的报表设计 5.15 修改编辑对话的缺省 5.16 重命令记录格式 5.17 记录格式间隔 5.18...
在java项目开发中一般都用到mybatis框架,就会涉及到实体和表的映射,mapper的生成,mybatis-generator插件可以根据表结构自动生成实体和mapper,大大简化了开发的工作量 目前这个插件生成的原始实体没有字段注释,...
需求:把一个表某个字段内容复制到另一张表的某个字段。 实现sql语句1: 代码如下:UPDATE file_manager_folder f1LEFT OUTER JOIN file_manager_folder f2 ON f1.name = f2.name AND f2.parentId = 54SET f1.parentId...