c# - 为什么我的单例有两个不同的实例?

标签 c# unity3d singleton monodevelop

我使用以下模式在 Unity 中创建我的单例

public class BlobManager : MonoBehaviour  
{
    public static BlobManager instance {get; private set;}
    void Awake () 
    {
        if(instance != null && instance != this)
           Destroy(gameObject);

        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    public void SomeFunction()
    {
       if (this != instance)
           Debug.Log("They're Different!")
    }
}

SomeFunction() 所示,它们最终总是不同的。当我在本地为类 BlobManager 设置一个值,并为使用静态变量“实例”设置另一个值时,如下所示:

foo = "bar"; 
BlobManager.instance.foo = "foo";

在类中的断点上的调试器中看到的 foo a 的值将始终为“bar”。但是当其他类尝试访问同一个变量时,它将是“foo”。

我不确定如何查看 Monodevelop 中的内存地址,但我确定 thisthis.instance 会有不同的内存地址。 我的单例模式有问题吗?我也尝试过其他模式,结果相同。

最佳答案

在您的示例中,BlobManager 实例化发生多次,但只有第一个实例保存在属性 Instance 中。

派生自 MonoBehaviour 意味着您可以将脚本附加到处理许多实例的许多对象。 Singleton 必须有私有(private)构造函数,没有 MonoBehaviour 派生,并且您不能将此脚本附加到任何对象。如果您需要将脚本附加到对象,您应该创建另一个派生自 MonoBehaviour 并控制单例的脚本

示例(未测试):

public class BlobManager
{
    static BlobManager _inst;
    public static BlobManager Instance {
    get
    {
        if (_inst == null)
            _inst = new BlobManager();
        return _inst;
    }
    }

    private BlobManager() 
    {

    }
}

关于c# - 为什么我的单例有两个不同的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30205680/

相关文章:

c++ - Singleton 实现之间的差异

c# - 使用 HTTP 触发器读取和写入 Blob 的 Azure 函数

c# - 使用 View.Details 用 ImageList 填充 ListView

c# - 限制为程序集添加引用

c# - 在 C# 中比较数组的值

c++ - 单例死引用问题

c# - 如何在 Android 中查找 "StreamingAssets"文件夹中的文件列表

unity3d - 无法使用 Unity 3D 物理阻止球弹跳

c# - 如何在知道方向、角度和距离的情况下找到位置?

java - 我可以 Autowiring 适配器类吗?