大家对于static关键字应该比较眼熟了,但是很多人对static关键字不理解,这其实就是对于auto的不理解。static关键字不是auto,变量在程序初始化时被分配,直到程序退出前才被释放。
静态变量
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。
有时候,我们希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代码国家名称的变量。例子:
- protected void Page_Load(object sender, EventArgs e)
- {
- //直接使用“类名.成员”的格式,不能使用“对象名.成员”的格式,这点与JAVA不一样,JAVA两种都可以使用
- Response.Write(Chinese.Country);
- }
- class Chinese
- {
- public static string Country = "中国";
- public void getCountry()
- {
- //类中的成员方法也可以直接访问静态成员变量
- HttpContext.Current.Response.Write("你好!" + Country);
- }
- }
需要注意的是:不能把任何方法体内的变量声明为静态,如下面这样是不行的:
- public void getCountry()
- {
- //类中的成员方法也可以直接访问静态成员变量
- HttpContext.Current.Response.Write("你好!" + Country);
- static int i = 1;
- }
静态方法
我们有时也希望不必创建对象就可以调用某个方法,换句话说也就是使该方法不必和对象绑定在一起。要实现这样的效果,只需要在类中定义的方法前加上static关键字就可以了,我们称这种方法为静态成员方法,还可以在类的非静态成员方法中象访问其他静态方法一样去访问这个静态方法,例子:
- protected void Page_Load(object sender, EventArgs e)
- {
- Chinese.getCountry();
- }
- class Chinese
- {
- public static void getCountry()
- {
- HttpContext.Current.Response.Write("你好!中国");
- }
- }
注意:在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可以使用,而静态方法在使用前不用创建任何对象。
const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。
二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。
要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short和long总是默认为int一样;我们通常声明一个变量:
- int a;
- string s;
其实就是:
- auto int a;
- auto string s;
而static变量的声明是:
- static int a;
- static string s;
这样似乎可以更有利于理解auto和static是一对成对的关键字吧,就像private,protected,public一样;
对于static关键字的不理解,其实就是对于auto的不理解,因为它是更一般的;有的东西你天天在用,但未必就代表你真正了解它;auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;而static就是不auto,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期
【编辑推荐】