C#中静态和非静态的区别
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //静态和非静态的区别 namespace CSharp { //在非静态类中,既可以有实例成员,也可以有静态成员。而在静态类中只能有静态成员。而且静态类是不允许被实例化的,需要里面成员,直接类名.成员名即可。 //使用:如果想要把类当做“工具箱”去使用,就使用静态类,不需要实例化对象,直接类名.成员名就变得方便。如Console控制台类。经常使用。 //静态类在整个项目中资源共享。静态类占内存的,人为给内存分五个区域,我们用3个:堆,栈,静态存储区域(每个人都可以访问)典型例子:QQ登陆后,保存用户名密码在静态类中 //释放资源gc(garbage collection垃圾回收器):只有在程序结束后静态类才会释放资源。 public class Demo { static string _name;//静态成员调用必须类名.成员名 public static string Name { get { return Demo._name; } set { Demo._name = value; } } public void M() { Console.WriteLine("这是一个非静态方法,也叫普通方法,可以访问静态的,也可以访问非静态的。"); } public static void M1() { Console.WriteLine("这是一个静态方法,关键字:static只能访问静态成员,不能访问实例成员"); } } class Demo2 { static void Main(string[] args) { //区别一:静态方法不能被实例化,(静态成员必须是类名去调用,实例成员必须是对象名去调用) Demo d = new Demo(); d.M();//非静态成员调用必须实例化对象。对象名.实例成员。 //静态方法调用:类名.静态成员 Demo.M1();//如果静态方法在同一个类中可以省略类名不想,直接M1();来调用,不在同一个类中必须加类名.成员名 //静态变量和非静态变量区别:普通变量在子程序中,每次调用时都会从初始化值开始,不会保留原有数据,静态变量调用时原有值不会发生改变,只会记录最后一次值。 Demo2 d2 = new Demo2(); for (int i = 0; i < 5; i++) { d2.fun(); d2.fun1(); } Console.ReadKey(); Console.ReadLine();//利用接收输入来暂停程序,避免程序一闪而过 } void fun() //输出结果为11111 { int k = 0;//局部变量存放在内存的栈区。 k++; Console.Write("非静态变量:" + k); } //全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域; int c;//全局变量,在整个工程文件内都有效.而静态全局变量只能对当前类文件有效,对其他类文件无效.但是在c#中没有全局变量的概念只有【静态全局变量】。 static int j = 0;//C# 语言不允许使用 static 修饰符来声明方法内部的变量。但是在 C/C++ 语言中是允许这么做的。因此只能只能在类中定义一个静态变量成员,然后提供给类方法调用 void fun1() //输出结果为12345 { j++; Console.WriteLine(",静态变量:" + j); } } }
静态成员:属于整个类(对所有对象共享,在c#中可以认为全局变量),每次调用都会保存最后一次赋值直到程序结束才会释放空间初始化值。
实例成员:属于当前所创建的对象(每个单独对象都特有),如:每次实例化都会初始化值。
调用区别:静态成员:类名.成员名 ,实例成员:对象名.成员名-----》需要先实例化对象,才能得到对象。
定义区别:静态的只能引用静态的;实例的可以引用静态的也可以引用实例的。
静态类和非静态类的区别:1.静态类不能被继承,非静态类可以被继承。2.静态类所有成员必须是静态的,非静态类值成员可以是静态的也可以是非静态的不受限制。