C#静态类,静态构造函数,静态变量

本篇体验静态变量、静态构造函数和静态类。

静态变量

静态变量位于栈上,它是一个全局变量,在编译期就已经生成。

    public class Cow
    {
        public static int count;
        private int id;

        public Cow()
        {
            id = ++count;
        }
    }

客户端创建2个Cow的实例,并打印静态变量count。

        static void Main(string[] args)
        {
            Console.WriteLine(Cow.count);
            Cow cow1 = new Cow();
            Cow cow2 = new Cow();
            Console.WriteLine(Cow.count);
        }

结果:
0
2

○ 在创建Cow实例之前,全局就已经有了count这个静态变量
○ 如果在static之前用private修饰,就不可以通过"类名.静态字段名"来访问静态字段,但全局的静态字段始终存在

在堆和栈上的表现,如下图:

静态构造函数

在Cow类中添加一个静态构造函数。

    public class Cow
    {
        public static int count;
        private int id;

        public Cow()
        {
            id = ++count;
        }

        static Cow()
        {
            count = new Random().Next(100);
        }
    }

在构造函数和静态构造函数中,都对Cow的静态字段赋值。现在我们想了解静态构造函数在什么时候触发。是在用构造函数创建实例的时候触发吗?会不会在设置Cow的字段或属性值的时候触发?在客户端,通过打印静态字段count的值来了解静态构造函数什么时候被触发。

        static void Main(string[] args)
        {
            Cow cow1 = new Cow();
            Console.WriteLine("创建第一个Cow实例后count为:"+ Cow.count);
            Cow cow2 = new Cow();
            Console.WriteLine("创建第二个Cow实例后count为:" + Cow.count);
        }

○ 静态构造函数在创建第一个Cow实例的时候被触发
○ 在创建第二个Cow实例的时候,静态构造函数没有被触发,而是通过构造函数创建实例
○ 静态构造函数只执行一次

由此,我们是否可以这样定论:静态构造函数是在创建第一个实例时候被触发的?

横看成岭侧成峰,来换个角度思考这个问题。在为类的字段赋值时,会不会触发静态构造函数呢?

把Cow类修改为:

    public class Cow
    {
        public static int count;
        private int id;
        public static int whatever;
        public Cow()
        {
            id = ++count;
        }

        static Cow()
        {
            count = new Random().Next(100);
            whatever = count + 10;
            Console.WriteLine("静态构造函数被触发后count为:" + Cow.count);
            Console.WriteLine("静态构造函数被触发后whatever为:" + Cow.whatever);
        }
    }

客户端修改为:

        static void Main(string[] args)
        {
            Cow.count = 100;
            Cow cow1 = new Cow();
            Console.WriteLine("创建第一个Cow实例后count为:"+ Cow.count);
            Cow cow2 = new Cow();
            Console.WriteLine("创建第二个Cow实例后count为:" + Cow.count);
        }

○ 在为Cow的字段赋值之前,静态构造函数被触发
○ 接着创建Cow实例,静态构造函数不会被再次触发
○ 静态构造函数只执行一次

到这里,关于静态构造函数被触发的时机,我们可以这样下结论:无论是通过构造函数创建实例,还是给类的字段或属性赋值,静态构造函数是在所有这些动作之前被触发的。

静态类

首先创建一个类,包括静态成员和非静态成员。

    public class Logger
    {
        private static int logNumber = 0;

        static public void InitializeLogging()
        {
            Console.WriteLine("日志初始化");
        }

        static public void CloseLog()
        {
            Console.WriteLine("日志关闭");
        }

        static public void LogMsg(string msg)
        {
            Console.WriteLine("日志编号为:" + logNumber + ":" + msg);
        }

        public void DoSth()
        {
            Console.WriteLine("我不是静态方法~~");
        }
    }


在客户端,既可以通过"类名.静态方法名称"调用方法,也可以通过类的实例调用方法。

        static void Main(string[] args)
        {
            Logger.InitializeLogging();
            Logger.LogMsg("日志被记录下了~~");
            Logger.CloseLog();

            Logger logger = new Logger();
            logger.DoSth();
        }

如果把一个类设置成静态类,意味着:这个类的所有一切存在于栈上,因此该类中不能有实例方法,也不能创建该类实例。

修改Logger类,把实例方法去掉。

    public static class Logger
    {
        private static int logNumber = 0;

        static public void InitializeLogging()
        {
            Console.WriteLine("日志初始化");
        }

        static public void CloseLog()
        {
            Console.WriteLine("日志关闭");
        }

        static public void LogMsg(string msg)
        {
            Console.WriteLine("日志编号为:" + logNumber + ":" + msg);
        }
    }

在客户端,更不能创建Logger的实例,只能通过"类名.静态方法名"调用方法。

        static void Main(string[] args)
        {
            Logger.InitializeLogging();
            Logger.LogMsg("日志被记录下了~~");
            Logger.CloseLog();
        }

总结:
○ 静态变量属于全局,位于栈上
○ 静态构造函数只被触发一次,无论是通过构造函数创建实例,还是给类的字段或属性赋值,静态构造函数的触发时机都在这些动作之前
○ 静态类中不能有实例成员

时间: 2024-10-12 03:27:00

C#静态类,静态构造函数,静态变量的相关文章

关于C#的静态类和静态构造函数

静态构造函数是C#的一个新特性,其实好像很少用到.不过当我们想初始化一些静态变量的时候就需要用到它了.这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次.也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用. class SimpleClass { // Static constructor static SimpleClass() { // } } 在使用静态构造函数的时候应该注意几点: 1.静态构造函数既没有访问修饰符,也没有参数.因为是.NET调用的

php中static静态类与static 静态变量用法区别

1. 创建对象$object = new Class(),然后使用"->"调用:$object->attribute/function,前提是该变量/方法可访问. 2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以.但是有前提条件: A. 如果是变量,需要该变量可访问. B. 如果是方法,除了该方法可访问外,还需要满足: b1) 如果是静态方法,没有特殊条件: b2) 如果是非静态方法,需要改方法中没有使用$this,即

java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数

如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test; public class TestClass{ // 成员变量赋值第一个执行 private static int m1=1; private int m2=1; // 静态构造函数第二个执行 static{ System.out.println("成员变量赋值先于静态构造函数 m1="+m1); m1=2; } // 构造函数第三个执行 public Tes

深入了解C#中的静态变量和静态构造函数

深入的剖析C#中静态变量和静态构造函数: 在日常的程序开发过程经常会使用到静态变量,众所周知,静态变量时常驻内存的变量,它的生命周期是从初始化开始一直到Application结束.但是,我们经常会忽略静态变量的初始化时机.一下深入的介绍一下static变量是如何初始化的. 在一个类中定义了静态的变量,这个类就肯定会存在静态的构造函数,无论是我们自己定义了静态的构造函数还是不定义静态构造函数,如果不定义静态的构造函数,编译器会自动给我们生成默认的静态构造函数.而类的静态变量的初始化的 执行时机就是

静态构造函数和静态类

静态构造函数: 1. 一个类只能定义一个静态构造函数.换句话说,静态构造函数不能被重载. 2. 无访问修饰符.无参. 3. 无论创建了多少类型的对象,静态构造函数只执行一次. 4. 无参数的构造函数可以与静态构造函数共存.尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突. 5. 静态构造函数不可以被继承. 4. 运行库创建类实例或调用者首次访问静态成员之前,运行库会调用静态构造函数. 5. 静态构造函数的执行先于任何实例级别的构造函数. 静态类: 只能有静态成员, 只能包含用stati

C# 静态构造函数,静态变量执行顺序(升华版)

上篇 是基本语法基础下的执行顺序,包括继承这个维度下的执行顺序,我们可以依照的规律顺下来,下面我们看下一些摸不到头脑的情况 我们实验 一个 类中的方法 去调用另一个非继承类的情况,  先看有 静态构造函数 和没有静态构造函数执行的差别 class Program { static void Main(string[] args) { //执行顺序5 var de = new People("2"); //执行顺序6 People.Instance.OutDemo(); //执行顺序8

封装 重载 构造函数 静态变量

namespace ConsoleApplication3 { class Class1 { private string _name; public string Name { get { return _name; } set { _name = value; } } private string _type; public string Type { get { return _type; }//取值 set { _type = value; }//赋值 } private string

cs——静态构造函数

定义如下测试类 public class Test { public static int msA = 10; static Test() { System.Console.WriteLine(string.Format("msA0:{0}", msA)); msA = msA + msA; System.Console.WriteLine(string.Format("msA1:{0}", msA)); } public Test() { msA = 30; Sy

C# 静态构造函数使用

当我们想初始化一些静态变量的时候,就需要用到静态构造函数了.这个静态构造函数属于类,而不属于实例,就是说这个构造函数只会被执行一次,即:在创建第一个实例或引用任何静态成员之前,由.NET自动调用. 现在碰到这样一个场景:提供一个静态方法,这个静态方法在不同的地方使用,涉及到一个参数值不同,而其他内容都完全一致.如果是将静态方法的内容复制出来做成另外一个方法,代码冗余太多,做法不可取.使用静态构造函数处理静态变量,则可以尽最大程度简化代码.如下示例: /// <summary> /// 基类 /