C# static的用法(非常详细,附带实例)
与 Java 的 static 相比,C# 语言的 static 限制比较多,例如,其无法由实体对象引用。
static 可以解释为静态,可以应用在类、字段、方法等上。如果是静态成员,此成员属于类本身,而不是特定的对象,C# 编译程序会为此类的静态成员创建一个固定的内存空间。
下列是 static 关键词应用在类的字段与方法声明上时的语法:
定义静态类时的语法如下所示:
【实例 1】:一家公司的业绩是由所有业务员的业绩求和得到的,这个程序会要求分别输入两个业务员的业绩,然后程序会输出公司的业绩。
【实例 2】输入新学生的姓名、学号和原先的学生人数,然后输出学生累计的人数。
【实例 3】千米与英里互相转换的应用。
使用静态构造方法时,需注意下列两点:
【实例 4】静态构造方法的应用,从这个实例可以看到创建两次 MyTest 类对象,只有第一次创建类对象时调用了静态构造方法。
static 可以解释为静态,可以应用在类、字段、方法等上。如果是静态成员,此成员属于类本身,而不是特定的对象,C# 编译程序会为此类的静态成员创建一个固定的内存空间。
下列是 static 关键词应用在类的字段与方法声明上时的语法:
class 类名称 { 存取修饰词 static 数据类型 域名; … 存取修饰词 static 数据类型 方法名称; }
定义静态类时的语法如下所示:
class static 类名称 { 存取修饰词 static 数据类型 域名; … 存取修饰词 static 数据类型 方法名称; }
C#类中的静态字段
当类含有静态字段时,表示此字段是此类所有对象共享的内存空间,使用 new 创建的对象无法直接引用此静态字段,需要通过类的方法间接引用。【实例 1】:一家公司的业绩是由所有业务员的业绩求和得到的,这个程序会要求分别输入两个业务员的业绩,然后程序会输出公司的业绩。
Revenue p1 = new Revenue(); Console.Write("请输入业务员 p1 的业绩:"); int rev = Convert.ToInt32(Console.ReadLine()); p1.Money += rev; // 业务员 p1 业绩 p1.PrintInfo(); Revenue p2 = new Revenue(); Console.Write("请输入业务员 p2 的业绩:"); rev = Convert.ToInt32(Console.ReadLine()); p2.Money += rev; // 业务员 p2 业绩 p2.PrintInfo(); public class Revenue { public static int _money; public int Money { get => _money; set => _money = value; } public void PrintInfo() { Console.WriteLine($"深智总业绩:{_money}"); } }执行结果为:
请输入业务员 p1 的业绩:10000
深智总业绩:10000
请输入业务员 p2 的业绩:25000
深智总业绩:35000
C#类中的静态方法
关键词 static 可以应用在方法中,当在类内声明静态方法后,此静态方法只能让类名称引用,无法被 new 所创建的类对象引用,然后此静态方法可以存取或操作类的静态变量。【实例 2】输入新学生的姓名、学号和原先的学生人数,然后输出学生累计的人数。
Console.Write("请输入新学生姓名:"); string name = Console.ReadLine(); Console.Write("请输入新学生学号:"); string id = Console.ReadLine(); Student e = new Student(name, id); Console.Write("请输入原先学生人数:"); string n = Console.ReadLine(); Student.studentCounter = Int32.Parse(n); // 转换字符串为整数 Student.AddStudent(); Console.WriteLine($"Name: {e.name}"); Console.WriteLine($"ID: {e.id}"); Console.WriteLine($"学生总人数:{Student.studentCounter}"); public class Student { public string id; public string name; public static int studentCounter; // 学生人数 public Student(string name, string id) { this.name = name; this.id = id; } public static int AddStudent() // 累计学生人数 { return ++studentCounter; } }执行结果为:
请输入新学生姓名:Jin-Kwei Hung
请输入新学生学号:651014
请输入原先学生人数:28
Name: Jin-Kwei Hung
ID: 651014
学生总人数:29
Student.studentCounter = Int32.Parse(n);第 13 行使用了类名称,取得静态字段的信息:
Student.studentCounter在顶级语句的第 9 行,使用类名称加上静态方法,操作静态变量,此操作其实就是在累计学生人数:
Student.AddStudent();
C#静态类
所谓的静态类就是一个类只能有静态字段或是静态方法,此静态类不可以有对象,同时无法被继承。操作静态字段或是方法,必须使用静态类名称。【实例 3】千米与英里互相转换的应用。
Console.WriteLine("请选择距离转换方式"); Console.WriteLine("1. 英里转千米"); Console.WriteLine("2. 千米转英里"); Console.Write("\n==> "); string selection = Console.ReadLine(); switch (selection) { case "1": Console.Write("请输入英里:"); double K = Converter.MileToKm(Console.ReadLine()); Console.WriteLine($"公里:{K:F2}"); break; case "2": Console.Write("请输入千米:"); double M = Converter.KmToMile(Console.ReadLine()); Console.WriteLine($"英里:{M:F2}"); break; default: Console.WriteLine("输入错误!!!"); break; } public static class Converter { public static double MileToKm(string mi) // 英里转千米 { double mile = Double.Parse(mi); double km = mile * 1.609; return km; } public static double KmToMile(string k) // 千米转英里 { double km = Double.Parse(k); double mile = km / 1.609; return mile; } }执行结果为:
请选择距离转换方式
1. 英里转千米
2. 千米转英里
==> 1
请输入英里:10
千米:16.09
C#静态构造方法
静态构造方法主要用于初始化静态字段,不论创建多少个对象此静态构造方法只能执行一次,这个方法可以在创建第一个实体对象前先被执行。使用静态构造方法时,需注意下列两点:
- 静态构造方法不能有存取修饰词或参数;
- 程序不可以调用静态构造方法。
【实例 4】静态构造方法的应用,从这个实例可以看到创建两次 MyTest 类对象,只有第一次创建类对象时调用了静态构造方法。
MyTest A = new MyTest(); A.PrintInfo(); Console.WriteLine("测试"); MyTest B = new MyTest(); B.PrintInfo(); class MyTest { static int price; static MyTest() // static constructor { Console.WriteLine("Static Constructor"); price += 10; } public MyTest() // 一般constructor { Console.WriteLine("一般Constructor"); price += 5; } public void PrintInfo() { Console.WriteLine(price); } }执行结果为:
Static Constructor
一般Constructor
15
测试
一般Constructor
20