zoukankan      html  css  js  c++  java
  • 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();
            }
        }

    小结

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

     

    感谢您的宝贵时间···

  • 相关阅读:
    准备使用 Office 365 中国版--邮箱迁移
    准备使用 Office 365 中国版--域名
    中国版的 Office 365
    了解 Office 365
    MySQL Database on Azure 参数设置
    MySQL Database on Azure 的用户名
    Android NOTE
    从源码看Android中sqlite是怎么通过cursorwindow读DB的
    一个由proguard与fastJson引起的血案
    【转载】淘宝架构框架发展史
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412330.html
Copyright © 2011-2022 走看看