博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#基础------------静态类与非静态类
阅读量:5234 次
发布时间:2019-06-14

本文共 2222 字,大约阅读时间需要 7 分钟。

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

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

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

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

 

转载于:https://www.cnblogs.com/lxGIS/p/3337561.html

你可能感兴趣的文章
到底是否应该重复造轮子
查看>>
Sharepoint学习笔记—习题系列--70-573习题解析 -(Q85-Q87)
查看>>
浅谈百度地图API的坑
查看>>
进击的UI-----------------UIActivityIndicatorView(活动指示器)
查看>>
Phaser之TextBox
查看>>
元素自动居中显示
查看>>
JDBC 时间处理
查看>>
hadopp 环境搭建
查看>>
[原创]java WEB学习笔记22:MVC案例完整实践(part 3)---多个请求对应一个Servlet解析...
查看>>
java运算符
查看>>
【2018】听懂你能看懂的句子
查看>>
mybatis源代码分析:深入了解mybatis延迟加载机制
查看>>
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
【BZOJ3052】【UOJ#58】【WC2013】糖果公园(树上莫队)
查看>>
荷兰国旗问题
查看>>
Process 启动参数问题
查看>>
提高PHP性能的10条建议
查看>>
我,不会吵,不会闹,心痛了用沉默代替
查看>>