C#中static关键字如何使用,在什么情况下使用?

一个月以前在上java课程的时候,老师讲到了static的基础用法,但是后来忘了,昨天突然想到了,就查阅了大量的资料,发现有些资料讲的就特别啰嗦,所以就讲各种各样的说法试了一下,总结出了这篇含金量比较高的文章,希望会对您有一些帮助。

一、先来了解static的中文意思

在这里插入图片描述
从上图可以看出,static是静止的,不动的意思

二、在C#中的意思

​ static是静态的的意思,既然是静态的,就是不变的意思,而不变就是它不会因为类中实例化对象的不同而不同,它在类中永远只有一份就像中国人有许多,但是我们这么多人只有一个国家——中国。

static可以修饰类、字段、属性以及方法。标记为static的就不用创建实例来调用了,如果外部要对其进行调用,可以直接通过(类名.方法名)来调用,内部就可以直接通过方法名调用。

三、由static修饰的归属问题

​ 被static修饰的不管是变量还是方法,都属于类直接管理,所以类中所有的方法(静态和实例的方法)都可以调用他们。举个例子吧,就不如:一个公司的打印机,它是属于公司公共的物品,而不是说属于哪个部门哪个人的,公司里的所有人员(实例)都有权去使用这个公共的打印机。

例如:

 class Program1
    {
        static int i;
        static void main() {	//被static修饰的方法,被称为静态方法
            Console.WriteLine(i);
        }
        public  void Ak() {	//Ak是实例方法
            Console.WriteLine("aaaaa");
            main();//实例方法可以调用静态方法main();
        }
    }

四、static修饰的范围

1、类

static可以修饰类,使类成为静态类。这样在此类中只能定义静态的方法和静态的变量

(1)静态类和非静态类的区别

​ 静态类和非静态类最重要的区别在于静态类不能被实例化,也就是说不能使用new关键字创建静态类类型的变量。

​ 在声明一个类时使用static关键字,具有两方面的意义:第一:它防止程序员写代码来实例化该静态类;第二,它防止在类的内部声明任何实例字段或方法,也就是说静态类中的字段方法必须为静态的而不是实例的。

(2)静态类的特征

  • 静态类中只能包含静态成员,其他实例成员一律不行
    在这里插入图片描述
  • 静态类无法通过new关键字的方法实例化
    在这里插入图片描述
  • 静态类的本质,是一个抽象的密封类,所以不能作为基类用来继承
  • 不能包含实例构造函数
  • 如果一个类下的所有成员都需要被共享,就是供其他类使用,那么就可以把这个类定义为静态类

2、变量

static可以修饰变量,注意:这个变量只能是成员变量,而不能是局部变量

静态成员变量的特点:
  • 静态成员变量是属于类的,类被加载时初始化,并且有默认初始值(实例成员变量属于对象,在每个对象被创建时初始化,每个对象一份)
  • 存在优先于对象,被所有对象所共享,常驻内存

3、方法

static可以修饰方法,Main方法必须用static修饰,因为它是与程序共存亡的,是程序的入口和程序的大门

静态方法的特点:
  • 静态方法是不属于特定对象的方法
  • 静态方法可以直接访问静态成员(包括静态字段、静态方法)
  • 静态方法不可以直接访问实例成员,并且静态方法也不能直接调用实例方法

例子1:

 class Program1
    {
        int i;//正确,成员变量有默认初始值
        public void Bb(/*tatic string str */)//错误,形式参数不能使用static修饰
        {
           // int c;//错误,局部变量需要手动赋值,才能使用
            //static int a;//错误,局部变量不能使用static修饰
        }
    }

例子2:

 static class Program1
    {
        int i;//错误,静态类中只能定义静态成员变量
        public void Bb()//错误,静态类中只能定义静态成员方法
        {
        }
    }

4、构造函数

static可以修饰,使构造函数成为静态构造函数。并且不能在再使用其他修饰符,并且不能是实例构造函数

静态构造函数的特点:
  • 静态类可以有静态构造函数,也就是说静态类中的构造函数只能是静态的,并且不可继承
  • 静态构造函数没有访问修饰符,没有参数,只有一个static修饰符
  • 在非静态类中也可以有静态构造函数,并且,静态构造函数在,非静态类在实例化之前要被自动执行,并且速度要比实例化后调用的构造函数要快
  • 静态构造函数只执行一次

例子:

  class Program1
    {
       static Program1()//静态构造函数
        {
            Console.WriteLine("静态构造函数被执行");
        }
        public Program1()//非静态构造函数
        {
            Console.WriteLine("非态构造函数被执行");
        }
    }
//外部调用
  static void Main(string[] args)
        {
          
            Program1 p = new Program1();
            Console.ReadLine();
        }

输出结果:
在这里插入图片描述

五、static修饰的调用

1、在本类里调用由static修饰的方法和变量,可以直接使用

  class Program1
    {
        static int i;//定义静态成员变量
        static public void Bb()//定义静态成员方法
        {
            Console.WriteLine(i);
            main();
        }
        static void main()
        {
            Console.WriteLine("我是成员方法main");
        }
    }

2、在外部类中调用static修饰的方法和变量,需要(类名.方法名或变量名)

//本类中
  class Program1
    {
        static public int i;//定义静态成员变量
        static public void Bb()//定义静态成员方法
       	 {
            Console.WriteLine(i);
         }
        static public void main()
       	 {
            Console.WriteLine("我是成员方法main");
         }
    }
    //外部类调用
      class Program
    {
        static int i;
        static void Main(string[] args)
        {
            //直接类名.方法名或者变量名调用
            Console.WriteLine(Program1.i);
            Program1.main();
            Program1.Bb();
        }
        
    }

六、什么情况下使用static修饰

  • 当变量需要共享时,可以将变量定义为静态变量
  • 当方法需要被反复调用时,可以将方法定义为静态方法
  • 当一个类中包含的成员都是静态时,可以将类定义为静态类

本篇文章详细讲解了static修饰符的用法,希望对各位朋友有所帮助。也许有些朋友会觉得我总结的不太完善或者有不对的地方,还请各位朋友能够指点迷津,指出我的错误,不要让我恶性循环了,哈哈哈,就跟大家说到这里吧,我会不定时更新博文的,还请各位朋友能多多支持,谢谢大家!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐