ZetCode

C# 静态 (static)

最后修改于 2023 年 7 月 5 日

在本文中,我们将介绍 C# 中的 static 修饰符关键字。

static 修饰符

静态成员属于类型,而不是属于特定的对象。

Console.WriteLine(Math.Abs(-5));

在这里,Abs 是一个静态方法,它属于静态的 Math 类型。我们通过类型名称后跟一个点运算符和一个成员方法名称来引用该方法。

在类、接口和结构体中,我们可以将 static 修饰符用于字段、方法、属性、运算符、事件和构造函数。

静态方法只能使用静态成员;它们不能访问实例变量。

以下是静态类的特性

以下是静态构造函数的特性

C# 静态成员

静态成员属于类型。

Program.cs
namespace StaticMember;

static class MyMath
{
    public static double PI = 3.14159265358979323846;
}


class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(MyMath.PI);
        Console.WriteLine(Math.Abs(-5));
    }
}

我们有一个静态的 MyMath 类,其中包含一个静态成员。

Console.WriteLine(MyMath.PI);
Console.WriteLine(Math.Abs(-5));

我们引用 MyMath 类的静态 PI 成员。 此外,我们还引用内置 Math 类的静态 Abs 方法。

$ dotnet run
3.141592653589793
5

C# 静态方法

静态方法只能访问静态变量。 它无法访问实例变量。 静态方法只能调用其他静态方法。

Program.cs
namespace SimpleEx;

class Program
{
    static int i = 0;

    static void Main(string[] args)
    {
        Console.WriteLine(i);

        i = i + 5;

        Console.WriteLine(i);

        Inc();

        Console.WriteLine(i);

        Dec();

        Console.WriteLine(i);
    }

    static void Inc()
    {
        i = i + 1;
    }

    static void Dec()
    {
        i = i - 1;
    }
}

在此示例中,我们有一个静态变量 i 和静态方法 MainConsole.WriteLineIncDec

static void Main(string[] args)
...

Main 方法是 C# 应用程序的经典入口点。 在静态 Main 方法中,我们只能调用静态方法。

$ dotnet run
0
5
6
5

C# 扩展方法

static 关键字用于定义扩展方法。 扩展方法是可以插入到现有类型的方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

Program.cs
var vals = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };

vals.Shuffle();

var res = string.Join(" ", vals);
Console.WriteLine(res);

static class MyExtensions
{
    private static Random rng = new Random();

    public static void Shuffle<T>(this IList<T> vals)
    {
        int n = vals.Count;

        while (n > 1)
        {
            n--;
            int k = rng.Next(n + 1);

            T value = vals[k];

            vals[k] = vals[n];
            vals[n] = value;
        }
    }
}

在此示例中,我们定义了一个 Shuffle 扩展方法。

vals.Shuffle();

我们调用 Shuffle 扩展方法。 编译器将其转换为 MyExtensions.Shuffle(vals);

static class MyExtensions

扩展方法在静态类中定义。

private static Random rng = new Random();

我们用来生成随机顺序的成员是静态的。

public static void Shuffle<T>(this IList<T> vals)

Shuffle 方法也使用 static 修饰符声明。

$ dotnet run
8 7 5 4 1 6 3 2
$ dotnet run
1 3 6 8 5 7 2 4

C# using static 指令

using static 允许我们访问类型的静态成员和嵌套类型,而无需使用类型名称限定访问。

Program.cs
using static System.Math;

Console.WriteLine(Sqrt(3*3 + 4*4));

在此示例中,我们将 Sqrt 方法导入到我们的命名空间中。

来源

static 修饰符 - 语言参考

在本文中,我们使用了 C# 中的 static 修饰符。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我在编程教学方面拥有超过十年的经验。

列出所有 C# 教程