C#-static

前言

  由于好多次都遇到了这个static关键字,概念还是模糊的不行不行的,终于还是有勇气从头到尾去理清一下下。这个关键字我第一次见它是在大话设计上那个单例模式里面,主要应用了一个类里面有一个静态方法,设置这个方法为静态的原因,就是为了保证全局只有一个实例访问点。下面我要说的是一些特别简单的不能再简单的,但是保证你看了你就懂了,它到底有什么作用。

内容

Static

  首先静态的东西,在内存中的存放是在data segment里面的。也就是说,这里面的内存块和程序的声明周期是一样的,也就是说程序结束的时候,这部分的内存才会得到释放。

静态成员变量

  程序刚刚开始运行的时候或者刚刚开始调用它的时候,进行第一次的初始化,而后直到程序结束都不在进行初始化了。

静态方法

  这个不用通过实例化对象来调用这个方法,该方法可以通过方法外面的类名直接调用得到。不用实例化一个对象,增加堆区的内存负担,而且减少了类与类之间的耦合依赖。

静态类

  这个和静态方法其实原理是一样的,一般我们不需要将类进行static修饰,因为静态类下面的每个方法都是static的(需要自行在方法前面加上static关键字)。

实践

下面我写了一个小的demo来说明这些会用什么不同:

  • 静态成员变量和普通变量:

 

public class Class1
    {
        static int a;//静态成员变量,程序调用的时候进行初始化,生命周期等同于程序运行周期

        public void BackNum0()
        {
            //普通变量,调用方法的时候进行初始化
            int b = 0;
            for (b = 0; b < 3; b++)
            {
                a = a + 1;
                Console.WriteLine(a);
            }
        }

        public void BackNum1()
        {
            //普通变量,调用方法的时候进行初始化
            int d = 0;
            int c = 0;
            for (c = 0; c < 3; c++)
            {
                d = d + 1;
                Console.WriteLine(d);
            }
        }
    }

  • 采用多线程进调用:

 

class Program
    {
        static void Main(string[] args)
        {
            //由于类里面的方法不是静态的,所以调用类里面的方法需要进行实例化操作。
            Class1 ob1 = new Class1();
            //调用方法中,调用了静态成员变量
            Thread thread1 = new Thread(ob1.BackNum0);//采用了委托原理,将要执行的方法作为参数赋给了其他线程
            Thread thread2 = new Thread(ob1.BackNum0);
            //运行结果对静态成员变量进行了叠加,由于有两个线程运行,则很可能会出现多种情况
            thread1.Start();
            thread2.Start();

            //调用方法中,未调用静态成员变量
            ob1.BackNum1();//运行结果为:123
            ob1.BackNum1();//运行结果为:123

            Console.ReadLine();
        }
    }

  • 多线程运行效果(以后用到多线程的时候,需要考虑static效果)


  • 静态方法

 

class Class2
    {
        public static void BackNum2()
        {
            int n = 0;
            int m = 0;

            for (n = 0; n < 3; n++)
            {
                m = m + 1;
                Console.WriteLine(m);
            }
        }
    }

  • 调用结果

 

class Program
    {
        static void Main(string[] args)
        {
            //不用实例化类,即可用类名直接调用静态成员方法;
            //调用方法中,未调用静态成员变量
            Class2.BackNum2();//运行结果为123
            Class2.BackNum2();//运行结果为123

            Console.ReadLine();
        }
    }

  • 静态类

 

//这里需要注意,当一个类是静态类的时候,需要对其里面的方法添加static修饰符
    public static class Class3
    {
        public static void BackNum3()
        {
            int j = 0;//普通变量
            int i = 0;//普通变量
            for (i = 0; i < 3; i++)
            {
                j = j + 1;
                Console.WriteLine(j);
            }
        }
    }

  • 调用

 

class Program
    {
        static void Main(string[] args)
        {

            //调用静态类中的静态方法,不用实例化
            Class3.BackNum3();//运行结果为123
            Class3.BackNum3();//运行结果为123

            Console.ReadLine();
        }
    }

小结

  上面的东西,其实很简单,但是由于个人傻傻分不清楚,所以总结了一下,希望有其他观点的同胞们一起交流。

 

感谢您的宝贵时间···

原文地址:https://www.cnblogs.com/zhoulitong/p/6412330.html