【问题标题】:What's the best way to organize a dictionary to exchange data?组织字典以交换数据的最佳方式是什么?
【发布时间】:2020-05-02 22:58:59
【问题描述】:

团结起来,我有一本字典,里面保存着很多数据。我需要访问数据、读取数据,有时还需要覆盖。我把它放在一个或多或少像

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&lt;MyData&gt;().someData(因为我需要在许多游戏对象和脚本中使用它)我正在考虑将字典设置为static,这将允许使用MyData.someData 引用它(并希望有更好的表现):

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

但是,当我尝试在其他类的Start 方法中访问字典数据时(因此应该在MyDataAwake 方法之后执行),MyData.someData 始终是null。我不知道这是否与调用顺序有关,或者将 Dictionary 设置为静态是否存在问题。我经验不足,无法理解。

static 是字典的正确用法吗?还是有更好的解决方案?

此外,如果有一本我只想阅读但从不修改的字典,有没有办法定义它以使其保持不可变?

【问题讨论】:

    标签: c# dictionary unity3d static


    【解决方案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 中有一个只读字典...https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.readonlydictionary-2?redirectedfrom=MSDN&view=netcore-3.1

    【讨论】:

      【解决方案2】:

      在 Awake 中实例化字典。 将项目添加到开始中的字典。 Awake 总是在开始之前被调用,所以这将保证你的字典在尝试访问它之前被初始化。

      【讨论】:

      • 谢谢!但是在Awake 之外实例化它并在Awake 中添加项目不是更好吗?执行顺序不是更快吗?
      • 唤醒发生在其他任何事情之前,您需要在添加项目之前对其进行实例化
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      相关资源
      最近更新 更多