Web Page Counter
Internet Date

c#基础------------静态类与非静态类

呵呵,静态类,静态构造函数,静态字段,静态属性和静态方法。既然是静,那就顾其名思其意吧。

静态成员主要包括静态字段和静态属性,静态成员可以实现类中能够被所有实例对象共享的数据。静态成员属于类所有,无论创建多少实例对象,静态成员在内存中只有一份。

1.什么是静态类呢?简单的来说一个类如果只包含静态成员和静态方法,则该类可以定义为静态类,定义的方法是给该类加上static修饰符。用一个例子简单说明下:

    static class MyStatic
    {
        private static string staticString = "这是一个静态字段";

        public static string StaticString
        {
            get { return MyStatic.staticString; }
            set { MyStatic.staticString = value; }
        }

        public static void ShowMsg()
        {
            Console.WriteLine(staticString);
        }
        public static void Main()
        {
            MyStatic.ShowMsg();
            Console.Read();
        }

    }

就像上面所说的那样静态类只能包含静态成员和静态方法,否则编译错误;要强调的是非静态类既可以包含非静态成员和非静态方法,也可以是静态成员和静态方法。

要再说明的一点是静态方法只能访问静态成员和静态方法,但可以间接通过创建实例对象来访问实例成员和实例方法;而实例方法可以直接访问实例成员和静态成员,也可以直接访问实例方法和静态方法。如果觉得绕的话,参考前一句我强调的那句就不难理解了。

这也就解答了我原先总是发现在static Main()函数所在的类里不能引用任何级别访问权限的实例成员,字段和实例方法及一般方法,除非他们被定义为static。道理很清楚,因为Main方法为静态的。

另外静态方法只能由类访问;实例方法只能由对象访问。静态方法不能被标记为vritual,abstract或者override,静态方法可以被派生类访问,但是不能被派生类覆写。(具体的看我昨天写的那个例子----在c#基础----base,this和new,override此文里)


 

2.再看静态构造函数和实例构造函数

      还是看看书中对静态构造函数的定义吧,静态构造函数,用于初始化类中的静态成员,包括静态字段和静态属性。静态构造函数不能带参数,不能有访问修饰符也不能被调用,通常由.Net运行库在第一次调用类成员之前执行。我还是继续把我调试通的代码放在下面:

    class ClassHelper
    {
        public static string StaticString = "我是一个静态字段";
        public string NonStaticString = "我是一个非静态字段";

        static ClassHelper()
        {
            StaticString = "静态字段在静态构造器里被初始化";
        }

        public ClassHelper()
        {
            NonStaticString = "非静态字段在实例构造器里被初始化";
            StaticString = "静态字段也可以在实例化构造器里被初始化";
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(ClassHelper.StaticString);

            ClassHelper ch = new ClassHelper();
            Console.WriteLine(ClassHelper.StaticString);
            Console.WriteLine(ch.NonStaticString);
            Console.Read();
        }
    }

不想再贴msdn和书中冗长的帮助和解释,在这里我就说几点平时用的多的和需要稍加注意的,静态构造函数可以和无参的实例构造函数同存,虽然参数列表相同,但是执行时间不同。另外静态函数只能对静态成员进行初始化操作,不能用于非静态成员。而实例构造函数,可以初始化实例成员,也可以是静态成员,但是静态只读字段除外。(上边的例子很好的解释了)。

构造函数的执行过程是个复杂的部分,它的执行顺序大概是这样的 : 分配静态成员的内存空间→执行静态成员初始化→执行静态构造函数→分配对象实例的内存空间→执行实例成员的初始化→执行实例构造函数

 

posted @ 2013-09-24 20:01  LX一木  阅读(309)  评论(0编辑  收藏  举报