首页 > 代码库 > 域的关键字

域的关键字

static 静态

readonly

域的声明中如果加上了readonly 修饰符表明该域为只读域对于只读域我们只
能在域的定义中和它所属类的构造函数中进行修改在其它情况下域是只读的
熟悉C 和C++程序员可能习惯了使用const 和#define 定义一些容易记住的名字来
表示某个数值static 和readonly 修饰符可以起到同样的效果
public class A
{
public static readonly double PI = 3.14159;
public static readonly Color White = new Color(255, 255, 255);
public static readonly int kByte = 1024;
//other members
}
这样在程序中我们就可以直接使用PI 来指代圆周率white 来表示白色等等
那么使用static readonly 与使用const 有什么区别呢简单地说const 型表达式
的值在编译时形成而static readonly 表达式的值直到程序运行时才形成看下面这个
例子

程序清单12-2:
using System;
namespace Program1
{
public class A
{
public static readonly int X = 1;
}
}

namespace Program2
{
class Test
{
static void Main() {
Console.WriteLine(Program1.A.X);
}
}
}
假定名字空间Program1 和 Program2 表示两个分别独立编译的程序有关名字空
间的概念我们将放在后续章节中介绍在这里域x 为静态只读的它的值由于是在
编译时形成的所以无论是否改变Program1 中x 的值只要不重新编译Program2
Program2 的输出就不会发生变化如果Program2 已经安装在用户的系统上对Program1
的升级不会影响到旧的Program2 的使用这种技术有利于进行版本控制

 域的初始化

对于静态变量非静态的对象变量和数组元素这些变量自动初始化为本身的默
认值对于所有引用类型的变量默认值为null 所有值类型的变量的默认值见下表
所示

部分类型的域初始化的值
变量类型默认值
sbyte, byte, short, ushort, int, uint, long, ulong 0
char \x0000
float 0.0f
double 0.0d
decimal 0.0m
bool false
enum 0

 

在默认的初始化之前域的值是不可预测的

class Test
{
static int a = b + 1;
static int b = a + 1;
}
实际上等价于
a = 1, b = 2
而下面的代码则是非法的
class A
{
int x = 1;
int y = x + 1;
}
因为非静态变量x 在类A 实例化以前并没有初始化代码y = x + 1 无法得到正确
的x 的值

域的关键字