【问题标题】:Clarifying Understanding of Fields澄清对领域的理解
【发布时间】:2018-10-27 16:53:34
【问题描述】:

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

【问题讨论】:

  • 那是完全正确的 - 未能解释字段是 变量 的教程可能不是最好的教程。需要考虑的是还有什么是变量而不是变量?属性是变量吗?数组元素是变量吗?形参是变量吗? out 参数呢? constreadonly 怎么样?你怎么看,你能证明你的观点吗?通过这种练习,您可以了解使事物成为变量的本质。

标签: c# unity3d field


【解决方案1】:

是的,你可以这么说。

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

另一方面,类和结构中的变量,即字段,只要对象存在,就会存在。即,它们在方法调用之间保持其值。

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


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

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

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

示例。有了这个类...

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

【讨论】:

  • 也许值得注意的是,这里的答案是关于“实例字段/变量”(或“对象变量”),它们与给定类型(类)的实例/对象相关联。 “类变量”——顾名思义——是静态字段,与类型(类)本身相关联并且独立于任何对象实例......
  • 有点吹毛求疵(嘿,现在是周末,我心情不错;-b):只要他们的访问修饰符是publicinternal,实例字段就不能只能通过类/结构中的实例方法访问,也可以从“外部”访问(当然需要引用与它们关联的对象实例)。好的,好的,我现在就去享受我的周末.. :-)
  • 因此我说“在类/结构内”,意思是对上述方法的限制。为了澄清,我改写了它。
  • 除了实例变量和静态变量之外,还可以使用ThreadStatic 属性创建线程变量(ThreadLocal<T> 是对ThreadStatic 的封装,更易于使用)。与名称相反,ThreadStatic 变量可以是实例变量(每个实例每个访问线程一个)或静态变量(每个访问线程一个)。这似乎是一个高级工具,但它对于包装缺乏线程安全的服务很有用(例如,Random)。
  • 请注意,Unity 不支持ThreadStatic。根据the official documentation,使用ThreadStatic 会导致Unity 崩溃。但是,我认为 Unity 4.3 中的 this was fixed
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2018-09-24
相关资源
最近更新 更多