在c#中没有全局变量的概念,变量的作用域总在声明它的地方。若想让达到作用域全局的效果可以通过静态来实现。一般情况下静态类会用于单例、公共工具类或工具方法,如GameTool、MathTool等。
将某类或某字段定义为静态后,在第一次调用时c#会将其从内存上分配到静态区域,他不再参与c#内存回收机制,一直存在不会销毁 直到程序结束关闭释放内存。
关键字:静态:static
目录
静态类定义:
将类定义为静态后,即不再拥有实例化的特性,不可再拥有并使用构造函数进行多个对象实例化。否则违反了全局唯一变量的概念。
静态类中的类成员必须全是静态的,静态类不能拥有实例化成员。
格式:访问权限修饰符 + static + class + 类名 + { 类主体 }
静态构造函数:
静态构造函数存于各种类中并只存在一个,在类被调用或实例化时第一个执行,只执行一次,无参无返无访问权限修饰符。
格式:static + 构造函数名(与类同名) + (无参) + {}
在静态类中只会有静态构造函数,而普通类和抽象类可以存在其他构造函数和静态构造函数。
静态字段&方法:
静态成员可以存于静态类中也可以存于普通类中,在访问权限修饰符后加上static关键字即可,在当前类的静态方法中,是无法直接引用本类中其他非静态成员的。
静态调用:
调用静态成员只需要使用 类名.静态成员名,无需再使用实例对象调用。
实例代码:
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
MyClass1._name="小明";//调用静态类的静态字段并赋值
//执行 静态无参构造 输出:MyClass1 执行静态构造函数
MyClass1.Func1();//调用静态类的静态方法 输出:MyClass1.Func1
//无静态无参构造的输出
MyClass2 myClass2 = new MyClass2();
//实例化一个对象 new()调用了一个无参构造函数
//发现静态无参构造最先执行 再执行实例化构造函数
MyClass2._id=1;//调用公开静态成员 通过类名.
MyClass2.Func2();//调用公开静态方法 通过类名.
}
}
public static class MyClass1//静态类
{
public static string _name;//访问权限修饰符为 公开
private static int _age;//访问权限为私有 外部获取不到仅在当前类中可访问
//int _id;//报错:不能在静态类中声明实例成员
//void Func0() { }//报错:不能在静态类中声明实例成员
static MyClass1()
{
Console.WriteLine("MyClass1 执行静态构造函数");
}
//public MyClass1() { }//报错:静态类不能拥有实例构造函数
public static void Func1()
{
Console.WriteLine("MyClass1.Func1");
_age = 10;//类成员在类内部可访问当前类私有成员
}
}
public class MyClass2//普通对象类
{
public static int _id;//公开静态成员
//静态构造函数只会调用一次
static MyClass2() { Console.WriteLine("MyClass2 执行静态构造函数"); }
//实力构造函数每次实例化时都会调用一次构造函数
public MyClass2() { Console.WriteLine("MyClass2 执行实例构造函数"); }
public static void Func2()//实例类可以包含静态成员
{
Console.WriteLine("MyClass2.Func2");
}
}
}