C#学习系列之静态成员和静态类
啰嗦
基础学习
静态成员
带有标识为static的字段、方法、属性、构造函数、事件就是静态成员。
class Dog
{
static string name;//静态成员
}
name可以被类的所有实例共享,所有实例都访问同一个内存位置。
静态成员可直接通过类名访问,例如dog.name="lili"
静态成员独立于任何实例,没有实例也可以访问。其初始化语句的任何静态成员使用之前调用。
静态函数成员也是独立于任何实例,没有实例也可以调用。 静态函数不能访问实例成员,仅能访问其他静态成员。
class Dog
{
static public void speak()//静态方法,打印静态成员
{
Console.writeLine(name);
}
}
静态构造函数,初始化对象,用于初始化静态字段。和类相同,使用static,无参数,无访问修饰符。
class Dog{
static Dog()
{//与类同名,无参,只能访问静态成员
name="lili";
}
}
静态字段定义后相当于公共财产,使用时,当派生类实例化多个使用,就会出现访问同一个静态字段的情况,如定义静态字段num用于计数,实例化多次,num就会++计数。当然前提需要在函数中出现num++的计数计算,每次调用就会计数累加。
class Pet
{
protected string _name;
public Pet(string name)
{
_name=name;
}
}
class Dog:Pet
{
static int num;
static Dog()
{
num=0;
}
public Dog(string name):base(name)
{
++num;//只要是Dog,那么就是会进行++计算。
}
}
静态类
包含静态的方法和属性,标识为static 不能创建实例,不能继承,可以构造静态构造函数。 用于基础类库(例如math中几乎都是静态的)和扩展方法。 扩展方法:源代码的基础上,一种直接添加新方法,一种不能修改以派生子类扩展,一种使用静态类扩展。
static class Petguide
{
public static double HowToFeed(Dog dog)//扩展方法,把dog对象传进来
{}
}
static class Petguide
{
public static double HowToFeed(this Dog dog)//加上this
{}
}
Dog dog=new Dog();
dog.HowToFeed();//用起来就像是本身的方法,直接用
所属的类必须是static类,扩展方法本身必须就是static方法,第一个参数类型必须是this+类名。 类本身没有相关的方法,通过扩展类来实现扩展一些方法。