静态成员
使用关键字static修饰的类型成员就是静态的类型的字段属性方法事件构造函数都可以是静态的例如在上面的PeopleClass中使用了以下代码定义了一个静态方法
publicstaticintCalculateAge(DateTimebirthday)
{
returnDateTimeNowSubtract(birthday)Days/;
}
这个静态方法就是能根据生日计算周岁数的由于计算周岁是一个通用的算法并不局限于某个特定的对象因此可以将其定义为静态类
静态成员类型无需创建对象实例即可通过类型名称成员名的方式调用比如以下代码就能调用CalculateAge方法
DateTimedtm=newDateTime();
intage=PeopleClassCalculateAge(dtm);
对于静态类型通过实例变量成员名的方式反而不能调用比如以下的代码是错误的
PeopleClassinstance=newPeopleClass();
DateTimedtm=newDateTime();
intage=instanceCalculateAge(dtm);
注意调用静态成员C#和VBNET语法有些差别在VBNET中可以使用派生的类型名称成员名来调用静态成员但C#不支持比如在类型A中定义了静态成员M而从类型A之上派生了类型B则在VBNET中可以使用AM或者BM来调用静态成员但在C#中不能用BM这种写法
例如以下代码中定义了静态方法Sum和静态字段Value
publicclassMyClass
{
publicstaticintValue=;
publicstaticintSum(intaintb)
{
returna+b;
}
}
这样我们就可以使用MyClassSum来调用这个方法而无需创建对象实例若还从这个类型派生了新类型其代码如下
publicclassOtherClass:MyClass
{
}
则在C#中只能使用MyClassSum来调用这个静态方法而在VBNET中可以有MyClassSum和OtherClassSum两种方式来调用这个静态方法
静态字段
对于静态字段是可以赋值的而且静态字段作用范围是整个程序相当于全局变量比如在任意地方修改了此处的静态变量Value的值后其他地方获得的字段值就是修改后的值
静态构造函数
被static修饰的无参数构造函数就是类型的静态构造函数例如对于上面的PeopleClass类型中就使用了以下代码定义了一个静态构造函数
staticPeopleClass()
{
SystemConsoleWriteLine(Start);
}
在程序加载的时候若程序没有调用PeopleClass中的成员静态构造函数不会被调用甚至使用typeof操作也不会调用但程序中第一次引用了类型的某个成员或者创建了对象实例前系统会自动的调用一次类型的静态构造函数而且整个软件运行期间某个类型的静态构造函数只可能调用一次不会被重复调用的
静态构造函数适用于延时进行系统初始化的操作这能加快系统的启动速度
注意静态构造函数必须是没有参数的而且肯定是私有的不能设置可访问级别
实例成员
没有被static关键字修饰的类型成员就是实例成员比如PeopleClass类型中定义了一个ToString方法其代码如下
publicoverridestringToString()
{
return_Code++_Name;
}
此时不能用PeopleClassToString来调用这个方法必须首先创建对象实例然后调用这个对象实例的方法其演示代码如下
PeopleClassinstance=newPeopleClass();
instanceToString();
虚拟成员
被关键字virtual修饰的成员类型是虚拟成员比如以下代码就包含了一个名为Sum的虚拟函数
publicclassMyClass
{
publicvirtualintSum(intaintb)
{
returna+b;
}
}
其实虚拟成员并不虚拟它可以包含实质性的功能代码能完成一定的功能只不过虚拟成员可以方便的被重载而已继承者也可以根据需要不重载这些虚拟方法
抽象成员
被关键字abstract修饰的类型成员就是抽象成员抽象成员只能是属性方法和索引器以下代码就定义了一个抽象方法
publicabstractintSum(intaintb);
在这段代码中public说明方法是公开的abstract说明这是一个抽象的成员int为方法的返回值类型Sum为方法的名称int a int b为方法的参数列表
定义抽象类型和定义接口的方法类似只需要写出成员的声明即可但还需要写出抽象成员的可访问性
抽象成员必须出现在抽象类中而且在从抽象类派生新类型时所有的抽象方法必须重写以填充方法体[袁永福版权所有]
抽象成员和虚拟成员是有区别的抽象成员不能定义任何实质的功能必须被重载而虚拟成员必须包含完整的代码结构可以包含实质功能可以不被重载
常数成员
被关键字const修饰的成员字段为常数字段可以使用类型名称字段名来引用常数比如以下代码就包含了一个常数
publicclassMyClass
{
publicconstdoublePI=;
}
对此我们可以使用MyClassPI来获得这个常数值常数值是不能修改的比如对于赋值代码MyClassPI = ;就是错误的相对于的静态字段是可以被修改的比如此处使用代码publicstaticdouble PI = ;来定义这个字段则就可以对这个字段赋值了