脚踏实地学C#4-静态类

起因

     问:静态类可以实现接口及继承?

     答:都不可以

     思考:为什么不可以呢?

学习

     静态类,有时我们又称为工具类(密封抽象类),从MSDN文档没有直接静态类的定义,这里只能说用static(不能用于结构,只能用于类)关键字声明的类,就是静态类。

     静态类与非静态类的区别:静态类不能实例化,就是不能通过使用 new 关键字创建静态类类型的变量。通过类名本身访问自身成员;   

     特性:1、仅包含静态成员(字段、方法、属性、事件)

                2、无法实例化

                3、是密封的

                4、不能包含实例构造函数

定义静态类及其使用

   //定义静态类和静态方法,未定义静态字段、属性、事件
   public static class CommonHelper
    {       
       public static void PrintContent()
       {
           Console.WriteLine("Static Class");           
       }
    }
    
 CommonHelper.PrintContent(); //调用静态类的静态方法

           静态类加载时机:和所有类类型一样,当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息。程序不能指定加载静态类的确切时间。但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。

静态类的本质

          通过静态类的的特性,就可以回答

                      1、静态类为可以实现接口?不可以,因为静态类无法实例化(只有类的实例才可以调用类中的接口方法)

                      2、静态类可以被继承吗?不可以,因为静态类是密封的

         这样来回答比较笼统,也不具有说服力哈,通过生成的IL就能清楚知道为什么了!

.class public abstract auto ansi sealed beforefieldinit CommonHelper  
    extends [mscorlib]System.Object
    //通过abstract关键字 不能实例化
    //通过sealed关键字 不能让其他类继承
{
    .method public hidebysig static void PrintContent() cil managed
    {
        .maxstack 8
        L_0000: ldstr "Static Class"
        L_0005: call void [mscorlib]System.Console::WriteLine(string)
        L_000a: ret 
    }

}

静态类、静态成员所分配的内存在程序结束时,才能被释放

posted @ 2013-09-30 20:45  秋壶冰月  阅读(752)  评论(0编辑  收藏