**
一周学会 C# (结构一)
C# 才鸟( QQ:249178521 )
**
** 10. ** ** 常量字段 ** ** **
· **_ 常量字段 _ ** ** ... **
w ** 隐含为 ** **_ static _ ** ** **
w ** 必须在声明时初始化 ** ** **
w ** 必须被初始化为编译时常量值 ** ** **
w ** 只有简单类型,枚举,字符串才可以是常量 ** ** **
** struct Pair **
** { **
** public Pair(int x, int y) **
** { **
** // ??? **
** } **
** ... **
** private const int x = 0, y = 0; **
** } **
在 C# 中,常量字段隐含为 static ,但你不能显式声明一个常量字段是 static :
static const int x = 0;// 错误
常量必须被初始化,并且只能在声明时初始化:
const int x;// 错误
常量必须被初始化为编译时常量值:
const int x = Method();// 错误
只有简单类型,枚举,字符串才能被声明为常量:
const Pair p = new Pair();// 错误
** 11. ** ** 找错 ** ** **
** struct HHG **
** { **
** HHG(int toTheGalaxy) **
** { **
** question = 9 * 6; 1 **
** ... **
** } **
** string cover = "Don't Panic"; 2 **
** static const int answer = 42; 3 **
** const Hiker arthur = new Hiker(); 4 **
** const int question; 5 **
** ... **
** } **
第 1 个语句的错误:不能在构造函数中初始化常量,常量只能在声明时初始化。
第 2 个语句的错误:结构中不能在声明实例字段时进行初始化,但在类中是可以的。
第 3 个语句的错误:不能显式声明常量字段为 static ,常量字段只能隐式为 static 。
第 4 个语句的错误:常量字段只能用于简单类型,枚举,字符串。
第 5 个语句的错误:常量字段在声明时没有被初始化。
** 12 ** ** .局部变量 ** ** **
· ** 局部变量 ** ** ... **
w ** 可以被声明为 ** **_ const _ ** ** ( ** ** 规则同字段 ** ** ) **
w ** 不能被声明为 ** **_ static _ ** **_ 或 _ ** ** or __ **
** struct Pair **
** { **
** void okay() **
** { **
** const int answer = 42; **
** ... **
** } **
** void compileTimeErrors() **
** { **
** const int local = call(); // ** ** 错误,必须 ** 被初始化为编译时常量值
** const Pair origin = ...; // ** ** 错误,常量只能为简单类型,枚举,字符串 **
** readonly Pair p = ...; // ** ** 错误,只有字段才能声明为 ** ** readonly **
** ... **
** } **
** ... **
** } **
** 13. ** ** 静态构造函数 ** ** **
· ** 静态构造函数初始化类 ** ** **
w ** 可以初始化 ** **_ static _ ** ** ** ** 字段而不是 ** ** c onst ** ** 字段 ** ** **
w ** 当类被装载时由 ** ** .net ** ** 调用 ** ** **
w ** 不能被调用:没有参数,没有访问修饰符 ** ** **
** struct Pair **
** { **
** public static readonly Pair Origin; **
** public Pair(int x, int y) **
** { **
** this.x = x; **
** this.y = y; **
** } **
** static Pair() **
** { **
** Origin = new Pair(0, 0); **
** } **
** private int x, y; **
** } **
静态构造函数只能由 .net 调用,而不能由程序员调用。这保证它会被调用,只被调用一次,并且在恰当的时候被调用(在任何类或结构被使用前)。因为程序员不能调用静态构造函数,所以静态构造函数没有参数。出于同样的原因,静态构造函数不能有访问修饰符。
静态构造函数不能被用来初始化常量字段,即使常量字段隐式为静态的。因为前面说过,常量字段必须被初始化,而且只能在它声明的时候初始化。