澄清对字段的理解

Clarifying Understanding of Fields

我目前正在通过一系列视频教程学习 Unity 中的 C#,并且刚刚介绍了一些字段。我说字段只是在 class 级别中声明的变量是否正确?

是的,你可以这样说。

主要区别在于方法中的变量(也称为局部变量)有一个在方法调用期间使用的临时值。下次调用该方法时,变量的先前值将丢失,您必须再次初始化它们。 (我不是在谈论迭代器和捕获变量等高级内容。)

另一方面,classes 和结构中的变量,即 fields,只要对象存在就存在。也就是说,它们在方法调用之间保持它们的值。

与最初未定义的局部变量不同,当从 class 创建对象时,字段会被分配一个默认值。结构字段的行为不同,具体取决于结构是用作 class 字段还是变量。结构字段与定义它们的字段或变量具有相同的定义。


正如@elgonzo 评论的那样,有两种类型的字段

  • 静态字段。它们使用 static 修饰符声明。对于特定的 class 或结构,静态字段仅存在一次,与此类对象的数量无关。
  • 每个对象存在一次实例字段(即 class 或结构实例)。

私有实例字段只能通过此 class 或结构的实例方法和构造函数访问,而私有静态字段可以通过静态方法和实例方法及构造函数访问。 (方法包括属性和索引器的 getter 和 setter。)

例子。有了这个 class...

public class A
{
    private static int _staticCounter;
    private int _instanceCounter;

    public void Count()
    {
        _staticCounter++;
        _instanceCounter++;
    }

    public void PrintCount()
    {
        Console.WriteLine($"Static = {_staticCounter}, Instance = {_instanceCounter}");
    }

    public static void PrintStatic()
    {
        Console.WriteLine($"Static = {_staticCounter}"); // Can only access static fields.
    }
}

...这次测试...

A x = new A();
A y = new A();

x.Count();
x.Count();
y.Count();
y.Count();
y.Count();

x.PrintCount();
y.PrintCount();
A.PrintStatic();
Console.ReadKey();

...将此打印到控制台

Static = 5, Instance = 2
Static = 5, Instance = 3
Static = 5