码迷,mamicode.com
首页 > 其他好文 > 详细

第7章 常量和字段

时间:2016-06-26 18:26:02      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

7.1常量

常量(constant)是一个特殊的符号,它有一个从不变化的值。常量只能在声明中初始化。定义常量符号时,它的值必须在编译时确定。

常数表达式是在编译时可被完全计算的表达式。因此不能从一个变量中提取的值来初始化常量。

如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的。

确定之后,编译器将常量的值保存到程序集的元数据中。这意味着只能为编译器认定的基元类型定义常量。然而C#也允许定义一个非基元类型的常量变量(constant variable),前提是把它的值设为null。

 技术分享

      

 class Calendar1

        {

            public const int months = 12;

        }

 

代码引用一个常量符号时,编译器会在定义常量的程序集的元数据中查找该符号,提取                                                                                                                                                                                                            常量的值,并将值嵌入生成的IL代码中。由于常量的值直接嵌入代码,所以在运行时不需要为常量分配任何内存。

常量是在编译时已知并在程序的生存期内不发生改变的不可变值。常量使用const修饰符进行声明。

只有C#内置类型可以声明为const。用户定义的类型(类,结构和数组)不能为const。请用readonly修饰符创建在运行时初始化一次即不可更改的类、结构和数组。

可以使用枚举类型为整数内置类型(列如int、long等)定义命名常量。

当编译器遇到 C# 源代码中的常量修饰符时,将直接把文本值替换到它生成的中间语言 (IL) 代码中。因为在运行时没有与常量关联的变量地址,所以 const 字段不能通过引用传递。

常量可标记为 public、private、protected、internal 或 protectedinternal。

未包含在定义常量的类中的表达式必须使用类名、一个句点和常量名来访问该常量。例如:

int birthstones = Calendar.months;

由于常量的值从不变化,常量总是被视为静态成员,而不是实例成员。

常量没有很好的跨程序性版本控制特性。开发人员更改了常量的值后,应用程序要获取新的常量值,必须重新编译。如果在运行时,从一个程序集提取另一个程序集的值,那么不应该使用常量,而应该使用readonly字段。

7.2字段

字段(field)是一种数据成员,其中容纳了一个值类型的实例或者对一个引用类型的引用。

“字段”是直接在类或结构中声明的任何类型的变量。

字段修饰符:

v  static:是类型状态的一部分,而不是对象状态的一部分。这使得调用方法在任何时候都能够使用字段,即使类没有任何实例。不管包含该静态字段的类生成多少个对象或根本无对象,该字段都只有一个实例,静态字段不能被撤销。必须采用如下方法引用静态字段:类名.静态字段名。

v  readonly:只读字段只能在初始化期间(字段声明中)或在定义类的构造函数中赋值(这种构造器方法只能调用一次,也就是对象首次创建时),在其它任何地方都不能改变只读字段的值。注意:但可利用反射来修改readonly字段。

CLR支持类型(静态)字段和实例(非静态)字段。对于类型字段,用于容纳字段数据的动态内存是在类型对象中分配的,而类型对象是在类型加载到一个AppDomain时创建的。对于实例字段,用于容纳字段数据的动态内存则是在构造类型的实例时分配的。

AppDomain简单的说就是应用程序的边界。可以通过它对相同进程中进行再次隔离。一个程序在运行的时候,它和它所引用、反射加载的所有模块的集合构成了一个程序域。普通桌面程序,一个程序就是一个AppDomain。CLR允许在一个进程中托管多个程序(比如IIS一类程序),一个IIS是可以运行很多网站的,如果这些网站都放在一个AppDomain里,一个网站崩溃了,其他网站也不能访问了。如果每个网站都作为独立的程序,对机器的性能要求又太高,而且没法共享一些资源。所以.net就有AppDomain的概念,一个IIS进程里,给每个网站一个AppDomain,这个每个网站都相互独立。

由于字段存储在动态内存中,所以他们的值在运行时才能获取。字段可以是任何数据类型,不必像常量那样仅仅是编译器内置的基元类型。

技术分享

第7章 常量和字段

标签:

原文地址:http://www.cnblogs.com/chrisghb8812/p/5618280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!