最后的据点

Think it,Plan it,Build it,Make it,Happy it,Enjoy it! 格物,诚意,志存高远,脚踏实地,让精益求精成为习惯!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

静态类

Posted on 2009-06-21 21:36  最后的据点  阅读(347)  评论(0编辑  收藏  举报

      静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。

      类可以声明为 static 的,以指示它仅包含静态成员。不能使用 new 关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 (CLR) 自动加载。

      使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。

      结构(值类型)不能用static来修饰,因为CLR要求值类型是必须实例化的。

静态类的主要功能如下:

  • 它们仅包含静态成员。

  • 它们不能被实例化。

  • 它们是密封的。

  • 它们不能包含实例构造函数(私有的实例构造函数也不行,但可以有静态构造函数)。

使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。

静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。

静态类的特点:

(1)必须直接从基类System.Object派生,因为从其它基类派生的类由于继承性仅适用于对象而没有任何意义,而且不能创建静态类的实例

(2)不能实现任何接口,因为只有使用类的实例才能去调用类的接口方法,而静态类不能被实例化

(3)静态类只能定义静态成员(字段、方法、属性、事件)

(4)静态类不能被用作字段、方法参数或局部变量,因为这些用法都将表明变量引用了实例

(5)静态类不能使用abstract或sealed修饰符。

(6)静态类的成员不能有protected或protected internal访问保护修饰符,都为public。

(7)静态类可以有静态构造函数,静态构造函数不可继承。 静态构造函数无访问修饰符、无参数(CLR调用的函数都模样)。

(8)静态类最主要的一个优点是写在栈中,安全高速稳定,而且在执行的时候,十分优先.

以下为写的一个测试类,含有静态构造函数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace StaticClassPractise
{
    public  static class Demo
    {
        public static string msg;
 
        static Demo() 
        {
            msg = "welcome to static class!";
        }
 
        public static void showMsg()
        {
            Console.WriteLine(msg);    
        }
    }
}

我们来看看反编译后的情况:

.class public abstract auto ansi sealed Demo
    extends [mscorlib]System.Object
{
    .method private hidebysig specialname rtspecialname static void .cctor() cil managed
    {
        .maxstack 8
        L_0000: nop 
        L_0001: ldstr "welcome to static class!"
        L_0006: stsfld string StaticClassPractise.Demo::msg
        L_000b: ret 
    }
 
    .method public hidebysig static void showMsg() cil managed
    {
        .maxstack 8
        L_0000: nop 
        L_0001: ldsfld string StaticClassPractise.Demo::msg
        L_0006: call void [mscorlib]System.Console::WriteLine(string)
        L_000b: nop 
        L_000c: ret 
    }
 
 
    .field public static string msg
 
}

可以看出,静态类,实际上本身就是sealed、abstract的。并且可以看出来,除了我们在类中写的静态构造函数,运行时并没有自动给该类生成任何的构造函数,如果我们在定义的时候也没有写静态构造函数,那么该类就一个构造函数都没有了。