Как лучше организовать словарь для обмена данными? - PullRequest
0 голосов
/ 03 мая 2020

В единстве у меня есть словарь, в котором я храню много данных. Мне нужно получить доступ к данным, прочитать их, а иногда перезаписать их . У меня есть это внутри класса, который написан более или менее как

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 каждый раз, когда мне нужны данные словаря (так как они нужны во многих GameObjects и скриптах), я думал о установка словаря как static, что позволило бы ссылаться на него с MyData.someData (и, надеюсь, с лучшей производительностью):

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

Однако, когда я пытаюсь получить доступ к данным словаря в методе Start другие классы (которые должны выполняться после Awake метода MyData), MyData.someData всегда null. Я не знаю, связано ли это с порядком вызовов или есть проблема с установкой словаря как stati c. Я недостаточно опытен, чтобы понять.

Является ли static правильным использованием здесь для словаря? Или есть лучшие решения?

Более того, если есть словарь, который я только хочу читать, но никогда не изменяю, есть ли способы определить его так, чтобы он оставался неизменным?

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Сделайте поле SomeData stati c, и тогда вы сможете назвать его как MyData.SomeData во всем приложении. Вам необходимо явно вызвать метод Awake(), чтобы добавить три экземпляра MyClass в словарь SomeData. Вы можете создать конструктор stati c и вызвать внутри него 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

1 голос
/ 03 мая 2020

создание словаря в Awake. добавить элементы в словарь в Пуск. Awake всегда вызывается перед запуском, поэтому это гарантирует, что ваш словарь инициализируется перед попыткой доступа к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...