C# static

之前对static一直有点困惑,看了忘,忘了看,其实是很基本的知识了,百度百科对static总结的非常具体全面,http://baike.baidu.com/link?url=XUDwsH_upXsWuGOPoRONNoYVgby_Ws_BtRbCiKP0oZyFG0qz0JkB9nyr66RJOguo还有一部分总结来源于《Visual C# 2010从入门到精通》,个人感觉这本书很好。

自己在这里再整理一下思绪,就当复习了。

1.静态变量(VS 非静态变量)//原文称面向过程的static

特点静态全局变量全局变量静态局部变量局部变量
作用域

声明它的整个文件;

不能被其他文件所用,即使using 相同的namespace

其他文件可定义相同名字的变量,不会发生冲突

整个工程

始终驻留在全局数据区,直到程序运行结束;

但作用域为局部作用域,当定义它的函数或

语句块结束时,其作用域随之结束?

声明它的函数体:程序运行到

该句会给局部变量分配栈内存,

程序退出函数体时,系统收回栈内存

内存分配存放于全局数据区:堆heap存放于全局数据区:堆heap存放于全局数据区:堆heap栈stack
其他特点

1被首次初始化之后,以后的函数调用不再

进行初始化

2.一般在声明处初始化,若没有显式初始化

会被程序自动初始化为0

C#不允许未赋值的局部变量

PS:const字段也是静态字段,但声明时不使用static关键字

2. 静态函数

静态函数只能在声明它的文件当中可见,不能被其它文件使用;其它文件中可以定义相同名字的函数,不会发生冲突。

3. 面向对象的static,只针对C#

  • 如果把一个方法或字段声明为static,就可以使用类名来调用方法或访问字段。
  • 在static方法中,不能访问类中定义的任何非实例字段,只能访问static字段;只能直接调用类中其他的static方法,非static方法要求先创建一个对象,然后才能在那个对象上调用非static方法。

4. static的作用(我认为是百科整篇精华的地方)

  • 隐藏(the most important)

同时编译多个文件时,所有未见static的全局变量和函数都具有全局可见性,但是不论函数还是变量,当加上static修饰符时,就会对其它源文件隐藏,作用域仅在声明它们的文件中。对于变量来说,还有以下两个作用。

  • 保持变量内容的持久

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。又因为static变量存放在静态存储区(堆),所以static可以控制变量的可见范围。

  • 默认初始化为0。根据百科中讲到,全局变量也具备这一属性,因为全局变量也存储在静态存储区中。在静态数据区,内存中所有的字节默认值都是0X00。有些情况下会给编程带来方便

再P了个S:据我目前所知,C#中的入口函数都必须是static的,因为删掉static关键字会报错:project'...' does not contain a static 'Main' method suitable for an entry point. 了解完static的特性之后就比较好解释这个问题了。根据上面第3点,当把方法声明为static时,该方法可以被直接调用,而不需要进行实例化。C#中的Main()方法也是包含在一个class中的,它是整个project的入口函数,在它之前没有任何代码能够去对它实例化,所以就有必要使用一个不需要实例化就能执行程序的方法。至于静态方法为什么不需要实例化,我觉得和内存分配方式有关,但是看了一篇http://www.cnblogs.com/chinhr/archive/2008/04/03/1135561.html关于实例方法和静态方法的文章,又有点困惑了。改天再想,先到这。