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

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

  • 相关阅读:
    virtualbox+vagrant学习-2(command cli)-19-vagrant box命令
    virtualbox+vagrant学习-2(command cli)-24-Aliases别名
    virtualbox+vagrant学习-2(command cli)-23-vagrant version命令
    virtualbox+vagrant学习-2(command cli)-22-vagrant validate命令
    如何快速学习一门技术或进入一个岗位
    EL表达式详解
    关于JSP乱码问题
    java mail使用qq邮箱发邮件的配置方法
    数据库命名规范
    java中的Serializable接口的作用
  • 原文地址:https://www.cnblogs.com/lxGIS/p/3337561.html
Copyright © 2020-2023  润新知