静态和非静态的方法
C#的类定义中可以包含两种方法静态的和非静态的使用了static 修饰符的方法
为静态方法反之则是非静态的
静态方法是一种特殊的成员方法它不属于类的某一个具体的实例非静态方法
可以访问类中的任何成员而静态方法只能访问类中的静态成员看这个例子
class A
{
int x;
static int y;
static int F() {
x = 1; //错误不允许访问
y = 2 //正确允许访问
}
在这个类定义中静态方法F()可以访问类中静态成员s 但不能访问非静态的成
员x 这是因为x 作为非静态成员在类的每个实例中都占有一个存储或者说具有
一个副本而静态方法是类所共享的它无法判断出当前的x 属于哪个类的实例所
以不知道应该到内存的哪个地址去读取当前x 的值而y 是非静态成员所有类的实
例都公用一个副本静态方法F 使用它就不存在什么问题
那么是不是静态方法就无法识别类的实例了呢在C#中我们可以灵活地采用
传递参数的办法第十章我们提到了一个windows 窗口程序的例子这里我们再对这
个例子进行一些改变
程序清单11-6
using System;
class Window
{
public string m_caption; //窗口的标题
public bool IsActive; //窗口是否被激活
public handle m_handle; //窗口的句柄
public static int m_total; //当前打开的窗口数目
public handle Window(){
m_total++; //窗口总数加1
// 创建窗口的一些执行代码
return m_handle;//窗口的返回值作为句柄
}
~Window(){
m_total--;//窗口总数减1
// 撤消窗口的一些执行代码
}
public static string GetWindowCaption(Window w)
{
return w.m_caption;
}
// 窗口的其它成员
}
分析一下上面例子中的代码每个窗口都有窗口标题m_caption 窗口句柄
m_handle 窗口是否激活IsActive 三个非静态的数据成员窗口句柄是Windows 操作
系统中保存窗口相关信息的一种数据结构我们在这个例子中简化了对句柄的使用
系统中总共打开的窗口数目m_total 作为一个静态成员每个窗口调用构造函数创建
这时m_total 的值加1 窗口关闭或因为其它行为撤消时通过析构函数m_total 的值
减1
我们要注意窗口类的静态方法GetWindowCaption(Window w) 这里它通过参数w
将对象传递给方法执行这样它就可以通过具体的类的实例指明调用的对象这时它
可以访问具体实例中的成员无论是静态成员还是非静态成员