C# static 干货全解析

发布时间:2020-06-21 10:19:32 作者:zbqdly
来源:网络 阅读:2264

讲解顺序

  1. 背景

  2. 静态字段

  3. 静态函数

  4. 静态方法

  5. 疑问解答



背景

在编写类的时候,有时候需要类里面的某个成员具有唯一性,也就是,对所有的对象都保持只有一个的状态。比如创建***,我们都是中国人,但总不能每个人都要保存一个中国人字段吧,用一个就够了

MSDN说:使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。也就是说,用static修改的对象是一个类的全部成员,不属于某个类特有的。比如,轿车有四个轮子,而不是某种轿车有四个轮子。

2.访问不需要声明类对象。比如

Console.Write();//Write()这就是一个静态方法,不需要new Consolo();

 2.static对象具有唯一性,无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。也就是说,你无论new多少类成员,静态变量只有一个,要变都变。



静态字段

所谓静态字段,也就是有static修改的字段啦(对,就是废话o(∩_∩)oC# static 干货全解析 )。

无论创建多少对象,静态字段代表的数据在内存空间中只有一个。比如说系统时间,无论你安装了多少软件,想知道现在几点了,都只有一个参考值,如果你改变了这个时间,那么其他软件获取的时间也都改变了。(当然,只是举例,具体咋访问时间的,俺不管)。

静态字段是在类操作(实例化、调用静态方法等)的时候第一个被实例化的对象。第二个是静态构造函数,而且他俩都只能被调用一次。

  1. 因为静态成员本身就是为了全局唯一性而生的,当然静态成员在整个函数内部相当于了全局变量。

  2. 静态成员只能被初始化一次,就是在第一次对这个类进行操作的时候创建。其他对整个类进行操作的时候,因为静态成员已经有了,自然不会再创建。(就是给菜鸟写的废话,不然很多人会有疑问,比如我。)

C# static 干货全解析

如上图,每次创建实例的时候,构造函数对两个字段进行+1,但是结果不一样,这就是static修饰的字段的唯一性。



静态构造函数

静态构造函数一般用来初始化静态变量,不会初始化非静态变量;但是因为非静态构造函数也能操作静态变量,所以就比较少用静态构造函数了。

无论对类进行何种操作,静态构造函数总是除了静态字段以外第一个被操作的方法,比非静态参数、非静态构造函数都要提前。

  1. 只能操作静态成员,因为非静态成员需要实体引用。

  2. 整个生命周期只会运行一次,且不可被调用。

  3. 静态构造函数不能有修饰符,因为只有系统才能调用,有没有public都没用;它也不能有输入参数。

  4. 如果类里面含有Main方法,则先执行静态构造函数;

    class A
    {
        public static int X;

        static A()
        {
            X = B.Y + 1;
        }
    }
    class B
    {
        public static int Y = A.X +1;
        static B()
        {
        }

        static void Main(string[] args)
        {
            Console.WriteLine(string.Format("Y={0}, X={1}", B.Y, A.X));//Y=2, X=1;
            Console.ReadLine();          
        }
     }

这是网上一个很有名的static的例子,如果不看答案,能够算出来才是本事。

  1. 首先,Main()方法在B类里面,所以需要先调用B类。

  2. 进入B类,先对静态字段Y分配空间,并默认赋值为0;注意,在这里Y已经初始化好了。

  3. 因为Y=A.X+1;所以操作A类的静态字段,现在进入A类。

  4. 同样的,先对A类的X分配空间并赋值为0。然后X=B.Y+1,B.Y已经存在了,为0,所以X=B.Y+1执行完后,X = 1。

  5. 调用A的静态构造函数。

  6. 完成Y的赋值,Y=A.X + 1,Y=2。

  7. 调用B的静态构造函数。

  8. 这时才会调用Main()方法,因为A.X,B.Y都完成了初始化并赋值,所以直接写出答案。

能够将完整的顺序描述出来,static一般的面试题都难不住你了(我的意思是我很牛C# static 干货全解析掰)



静态方法

    静态方法一般用于频繁调用又不经常修改的地方。比如连接数据库的基本语句。当然,这个特性也是因为静态方法无法被继承,无法进行扩展有关。

  1. 静态方法调用时不需要实例化类。

  2. 静态方法只能引用静态方法、字段、属性。静态方法里不能有非静态变量。

  3. 静态方法一经调用,就不能销毁,除非整个应用程序域都结束了。所以静态函数不能太多,否则一直占有内存。

  4. 因为静态方法不能访问非静态变量,所以与非静态方法耦合度较低,有利于代码的修改。

  5. 静态方法的执行效率比非静态方法要高,但是因为其一直占用内存不能被销毁,所以不能频繁使用静态方法。




疑问解答



以上信息都是我参考无数资料自己整理的,当然有可能出现一些错误,欢迎大婶们指正,我会努力修改好,让这篇文章作为一篇优秀的static参考资料

推荐阅读:
  1. 【C#冷知识系列】(二)关于变量和类型的冷知识
  2. C#的扩展方法解析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

static 静态字段

上一篇:全球7亿多电邮账号信息泄露,你数据还安全吗?

下一篇:Bind 9.10 源码安装 以及 新增redirect 类型 以及$GENERATE指令用法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》