关闭

C#静态(static)

发表于:2013-7-23 10:02

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Du_咳咳    来源:51Testing软件测试网采编

  一、函数

  函数的引入可以减少程序的目标代码,实现程序代码的共享。

  但是,函数调用也需要一些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调函数中,被调函数的程序代码执行完后,再返回到调用的地方。

  这种调用操作要求调用前保护现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但是对于一些函数体代码很短,但又被频繁地调用的函数,就不能忽视这种开销。引入内联函数和宏函数正是为了解决这个问题,提高程序的运行效率。

  在程序编译时,编译器将程序中出现的内联函数(宏函数)的调用表达式用内联函数(宏函数)的函数体来进行替换。由于在编译时将函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。

  在类静态数据成员不同于非静态的数据成员,一个类的静态数据成员仅创建和初始化一次,且在程序开始执行的时候创建,然后被该类的所有对象共享;而非静态的数据成员则随着对象的创建而多次创建和初始化; static成员是放在静态存储区的,它并不受访问控制符的限制,而其它的成员变量则是放在栈中的。

  二、使用方面

  1:windows的回调函数使用静态函数:

  在类中,static型的成员函数,由于是类所拥有的,而不是具体对象所有的,这一点对于windows的回调机制非常有用。因为对于回调函数而言,windows不会借助任何对象去调用它,也就不会传递this指针,那么对于一般成员函数作为回调函数的后果,就是堆栈中有一个随机的变量会成为this指针,这当然会引发程序的崩溃。而static函数,由于是整个类的,屏蔽了this指针。因此,如果成员函数作为回调函数,就应该用static去修饰它。

  2:线程控制函数常使用静态函数

  静态函数有特定的地址空间,这样可以避免在运行时system对内存调整带来的问题。

  3:Windows系统API,也常使用静态函数

  调用方面,不用在调用前实例化。

  静态方法也是由static修饰符来修饰的,静态方法是属于整个类的方法

  首先,调用静态方法时,应该是使用类名做前缀进行调用,而不是用  类名  c=new 类名();创建对象名来调用,因为静态方法属于整个类的方法。

  其次,非静态的方法属于某个对象的方法,是在这个对象在被创建时,系统为对象的方法在内存中分配单独的专用空间;而静态的方法则是属于整个内的方法,它随着类的定义而在内存中进行分配,不属于任何一个对象。

  最后,静态方法属于整个类的,因此它不能对某个对象的成员进行操作和处理,而只能对某个类的成员变量进行操作和处理,也就是说,静态方法只能处理静态数据T>。

  静态方法中没有this引用,不能在静态方法中访问非静态的成员和方法

  在同一个类中,静态的方法不能调用非静态的方法,但是在非静态方法中能调用静态的方法;

  一、静态成员(static)

  (1) 静态成员属于类所有,非静态成员属于类的实例所有。

  (2) 每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。

  二、静态方法

  (1) 静态方法属于类所有,类实例化前即可使用。  (2) 非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,这样,静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用.而静态变量的地址对类来说是固定的,故可以使用。

  (7) 无参数的构造函数可以与静态构造函数共存。尽管参数列表相同, 但一个属于类,一个属于实例,所以不会冲突。

  MSDN对静态构造函数的解释:   静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。   静态构造函数具有以下特点:

  (1)静态构造函数既没有访问修饰符,也没有参数。

  (2)在创建第一个实例或引用任何静态成员之前,将自动调用静态构造

  (3)函数来初始化类。

  (4)无法直接调用静态构造函数。

  (5)在程序中,用户无法控制何时执行静态构造函数。

  (6)静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。  (7)静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号