澄清对字段的理解
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
我目前正在通过一系列视频教程学习 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