`

常量和字段

    博客分类:
  • CLR
 
阅读更多

      定义常量符号时,它的值必须能在编译时确定。确定之后,编译器将常量的值保存到程序集的元数据中。这意味着只能为编译器认定的基元类型定义常量。在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字段是引用类型时,那么不可以改变的是引用,而非字段引用的对象。

分享到:
评论

相关推荐

    c# 常量和字段

    CLR支持类型字段和实例字段 类型字段:用于容纳字段数据的动态内存是在类型对象中分配的, 而类对象是在类型加载到一个AppDomain中创建的。 通常是在引用该类型的任何方法首次进行JIT编译的时候。 实例字段:用于...

    shrinker,用asm和transform api实现android r类的内联常量字段.zip

    收缩器将删除所有r.class和r\$**.class,所有常量整型字段将由asm和transform api内联。

    框架设计 CLR Via C#第二版.part1.rar

    作为深受编程人员爱戴和尊敬的编程专家,微软.NET开发团队的顾问... 第7章 常量和字段  第8章 方法:构造器、操作符、转换操作符和参数  第9章 属性  第10章 事件 第Ⅳ部分 基本类型  第11章 字符、字符串和文本

    框架设计 CLR Via C#第二版.part2.rar

    作为深受编程人员爱戴和尊敬的编程专家,微软.NET开发团队的顾问,本书作者Jeffrey Richter针对... 第7章 常量和字段  第8章 方法:构造器、操作符、转换操作符和参数  第9章 属性  第10章 事件 第Ⅳ部分 基本类型

    CLR.via.C#.3rd.Edition 2010 框架设计 Via C# 英文版 免积分

    第7章 常量和字段 第8章 方法:构造器、操作符、转换操作符和参数 第9章 属性 第10章 事件第Ⅳ部分 基本类型 第11章 字符、字符串和文本 第12章 枚举类型和位标志 第13章 数组 第14章 接口 第15章 委托 第16...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作符重载方法 8.4.1 操作符和编程语言互操作...

    CLR.via.C#.(中文第3版)(自制详细书签)

    第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作符重载方法 8.4.1 操作符和编程语言互操作性...

    C#中常量和只读变量的区别小结

    3.Const可以用在字段和局部变量,readonly只可以修饰字段 您可能感兴趣的文章:C#学习笔记整理_变量等基础语法(必看篇)C#把整个文件内容读入字符串变量的方法C#中static静态变量的用法实例C#不同类型的成员变量(字段...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作符重载方法 8.4.1 操作符和编程语言互操作...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作符重载方法 8.4.1 操作符和编程语言互操作...

    一起学习,一个小代码示例:类的声名.rar

    类是一种数据结构,包含数据成员(常量和字段)、函数成员(方法、属性、事件、索引器、运算符、实例构造函数、静态构造函数和析构函数)以及嵌套类型。

    c#只读字段和常量的区别,以及静态构造函数的使用实例

    主要介绍了c#只读字段和常量的区别,以及静态构造函数的使用实例,有需要的朋友可以参考一下

    JVM常量池教程吐血整理干货.md

    符号引用: 符号引用包括三种:类的全限定名,方法名和描述符,字段名和描述符。 Class文件常量池 运行时常量池 运行时常量池是在类加载阶段,将class二进制数据加载到内存, 并将数据保存到方法区,其中class文件中...

    博客系统 集成调试平台,支持类结构/jar结构预览、支持方法调试和监听、支持修改类字段(变量、常量、枚举)等

    集成调试平台,支持类结构/jar结构预览、支持方法调试和监听、支持修改类字段(变量、常量、枚举)等。前端功能包括:文章列表、文章类别、站长/博主信息、最新/最热文章、分页、友情链接、文章详情等。后台功能包括:...

    .NET 中的 常量字段const应用介绍

    C#中,当使用常数符号const时,编译器首先从定义常数的模块的元数据中找出该符号,并直接取出常数的值,接下来详细介绍,感兴趣的朋友可以参考下

    AS400 RLU编程wrod版

    5.10 定义表头行的字段做常量字段 5.11 定义表头行的每个字段做为分开的字段 5.12 引用数据库字段 5.13 打印报表样本 5.14 重用以前的报表设计 5.15 修改编辑对话的缺省 5.16 重命令记录格式 5.17 记录格式间隔 5.18...

    mybatis-generator生成代码完整示例

    在java项目开发中一般都用到mybatis框架,就会涉及到实体和表的映射,mapper的生成,mybatis-generator插件可以根据表结构自动生成实体和mapper,大大简化了开发的工作量 目前这个插件生成的原始实体没有字段注释,...

    mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法

    需求:把一个表某个字段内容复制到另一张表的某个字段。 实现sql语句1: 代码如下:UPDATE file_manager_folder f1LEFT OUTER JOIN file_manager_folder f2 ON f1.name = f2.name AND f2.parentId = 54SET f1.parentId...

Global site tag (gtag.js) - Google Analytics