首页 > 编程笔记 > C#笔记 阅读:54

C# static的用法(非常详细,附带实例)

与 Java 的 static 相比,C# 语言的 static 限制比较多,例如,其无法由实体对象引用。

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

上述程序第 14 行将 _money 声明为静态字段后,未来的类对象将共享此内存,所以不同业务员的业绩,经过第 4 行和第 9 行的求和,将会共享相同的内存,所以输入两个业务员的业绩可以获得公司的总业绩。

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

上述程序的重点是,在顶级语句第 8 行使用类名称,设定静态字段信息:
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

相关文章