组织字典交换数据的最好方法是什么?

问题描述 投票:0回答:1

在unity中,我有一个字典,在那里我保存了很多数据。我需要访问数据,读取数据,有时还需要 覆写. 我把它放在了一个类里,它的写法大致是这样的

public class myClass
{
    public int myNumber;
    public string myString;
}

public class MyData : MonoBehaviour
{
    public Dictionary<string, myClass> someData = new Dictionary<string, myClass>();

    private void Awake()
    {
        someData.Add("one", new myClass() { myNumber = 1, myString = "first" });
        someData.Add("two", new myClass() { myNumber = 2, myString = "second" });
        someData.Add("three", new myClass() { myNumber = 3, myString = "third" });
    }
}

为了避免调用 gameObject.GetComponent<MyData>().someData 每次我需要Dictionary的数据时(因为我需要在许多GameObjects和脚本中使用它),我都在考虑将Dictionary设为 static 这将允许用 MyData.someData 并希望有更好的性能)。

public static Dictionary<string, myClass> someData = new Dictionary<string, myClass>();

然而,当我试图访问Dictionary中的数据时 Start 方法后执行(因此应该在其他类的 Awake 方式 MyData), MyData.someData 总是 null. 不知道是跟调用顺序有关,还是把Dictionary设置成静态的问题。我经验不足,不明白。

是不是 static 这里的《辞海》的正确用法?还是有更好的解决办法?

另外,如果有一个Dictionary我只想读取但从不修改,有没有办法定义它,使它保持不变?

c# dictionary unity3d static
1个回答
1
投票

使 SomeData 静态字段,然后你可以将其调用为 MyData.SomeData 在您的应用程序中。 您需要明确地调用 Awake() 方法,以便添加三个 MyClass 实例到 SomeData 字典。你可以创建一个静态构造函数并调用 Awake() 里面。

public class MyData : MonoBehaviour
{
    public static Dictionary<string, myClass> someData = new Dictionary<string, myClass>();

    static MyData()
    {
        Awake();
    }

    private static void Awake()
    {
        someData.Add("one", new myClass() { myNumber = 1, myString = "first" });
        someData.Add("two", new myClass() { myNumber = 2, myString = "second" });
        someData.Add("three", new myClass() { myNumber = 3, myString = "third" });
    }
}

在.NET 4.5中有一个readonly dictionary...https:/docs.microsoft.comen-usdotnetapisystem.collection.objectmodel.readonlydictionary-2?redirectedfrom=MSDN&view=netcore-3.1。


1
投票

在Awake中实例化字典.在Start.Awake中向字典中添加项目,Awake总是在启动前被调用,所以这将保证你的字典在试图访问它之前被初始化。

© www.soinside.com 2019 - 2024. All rights reserved.