【问题标题】:Static reference to 'this' instance of a Class without ever instantiating an instance of the Class?在没有实例化类实例的情况下静态引用类的“this”实例?
【发布时间】:2015-04-02 17:01:24
【问题描述】:

我在 Unity3D 中使用 C# 进行编程,并在学习对象池时遇到了类似的代码:

public class MyClass : Object
{
    public static MyClass current;

    void Awake()
    {
        current = this;
    }

    public void SomeMethod()
    {

    }
}

public class Other
{
    void AnotherMethod()
    {
        MyClass.current.SomeMethod();
    }
}

现在 MyClass 类是非静态的,但是对它的实例 'this' 的引用 'current' 是(静态的)。 我可以调用公共非静态方法并访问所有其他公共非静态变量,方法是使用其他类中对“this”实例的静态引用“current”。

但如果我从未创建类 MyClass 的实例,那么静态引用指向什么?

【问题讨论】:

标签: c# unity3d static


【解决方案1】:

Class 类有一个静态字段,其中包含对自身单个实例的引用。如果您尝试从 Other 类访问它而不为 current 分配有效值,您将获得 NullReferenceException

实例可以在任何地方创建(因为它是一个公共静态字段),例如在某些启动代码中。使用单例模式,该类将具有一个私有构造函数和一个GetInstance(或GetCurrent)方法,该方法将在调用该类且current 为空时创建该类的一个实例。

没有实例就不能调用Awake(),所以可以这样初始化:

static void Main()
{
    // without this call, x.AnotherMethod will throw an exception.
    new Class().Awake();

    var x = new Other();
    x.AnotherMethod();
}

应尽可能避免给定模式,因为它具有全局变量的含义。您在任何时候都无法确定current 字段指向哪个实例。如果Class类没有内部状态,可以标记为静态,只暴露静态方法。

【讨论】:

  • 感谢您的帮助。我再次参考了该课程,它确实在稍后的代码中初始化了对象。 “当前”只是一个静态参考。如果我稍后不初始化它,它会抛出一个空引用异常。再次感谢!
【解决方案2】:

它不会指向任何东西,因此它会抛出一个空引用异常

【讨论】:

  • 真的很抱歉。这正是正在发生的事情。我提到了这个课程,它实际上稍后会被初始化。当前只是一个未初始化的引用。
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2021-01-07
相关资源
最近更新 更多