c # — Как сохранить данные в ФАЙЛЕ, чтобы сборщик мусора не удалял их

#c# #file #game-development

#c# #файл #разработка игр

Вопрос:

Я на ранней стадии создания своей игры, и я столкнулся с проблемой … сборщик мусора. У меня есть фабрика, которая создает всю информацию о покемонах, например, вот magikarp :

         private PokemonInfo Magikarp()
        {
            //General Information
            int pokedex = 052;
            string name = "Magikarp";
            string description = "It is said to be the world’s weakest Pokémon. No one knows why it has managed to survive.";
            int gender = (int)Enum.gender.Both;
            double height = 0.9;
            double weight = 10;

            //Typing
            int type = (int)Enum.type.Water;

            //Abilities
            List<Ability> abilitiesPokemon = new List<Ability>();
            abilitiesPokemon.Add(abilities[(int)Enum.ability.Swift_Swim]);

            //Stats
            int baseHP = 20;
            int baseAttack = 10;
            int baseDefense = 55;
            int baseSpecialAttack = 15;
            int baseSpecialDefense = 20;
            int baseSpeed = 80;

            //Battle
            int catchrate = 255;
            int experience = (int)Enum.experience.Slow;
            int experienceYield = 20;

            //Moves
            List<Learnset> learnset = new List<Learnset>();
            List<Move> tmPokemon = new List<Move>();
            //========================================================Leveling
            learnset.Add(new Learnset(moves[(int)Enum.move.Splash], 1));
            learnset.Add(new Learnset(moves[(int)Enum.move.Tackle], 15));
            learnset.Add(new Learnset(moves[(int)Enum.move.Flail], 30));
            //========================================================TM
            tmPokemon.Add(moves[(int)Enum.move.Bounce]);

            return new PokemonInfo(pokedex, name, description, gender, height, weight, type, abilitiesPokemon, catchrate, experience, experienceYield, baseHP, baseAttack, baseDefense, baseSpecialAttack, baseSpecialDefense, baseSpeed, learnset, tmPokemon, Gyarados(), 20);
        }
 

Есть ли способ создать файл со всеми моими данными PokemonInfo? Что-то, что я могу использовать, например :

 Pokedex.GetInfo(FILE.Magikarp).description;
 

Я путешествовал по Сети, искал повсюду, но не мог найти решение >. <

Комментарии:

1. Protobuf? Или база данных

2. Это проблема XY. Это не значит, что вы не должны сохранять данные в файле — продолжайте и делайте это — но если сборщик мусора действительно собирает ваши объекты, сначала решите это. Образно говоря, вы оставляете движущийся фургон на улице, за которым никто не следит, поэтому вещи крадутся. Другими словами, если вы не сохраняете хотя бы одну ссылку на каждый создаваемый вами объект, сборщик мусора может свободно собирать их. Пока где-то есть ссылка на объект, сборщик мусора оставит его в покое.

3. Просто чтобы добавить немного к комментарию @madreflection, если сборщик мусора собирает эти объекты, вы не сможете их использовать, потому что у вас все равно не будет к ним доступа, так что GC — это не ваша проблема.

4. @madreflection итак, если где-то есть ссылка, моя информация о покемонах никогда не будет съедена сборщиком мусора? :3

5. Да, где -то, что доступно для пользовательского кода. Если единственная ссылка на экземпляр X находится в поле в каком-либо другом экземпляре объекта Y, который недоступен для пользовательского кода, то ни один экземпляр X не является экземпляром, потому что цепочка доступа из пользовательского кода нарушена.

Ответ №1:

Вы можете создать класс (или статический класс) и объявить статические общедоступные свойства (или поля) для хранения ваших покемонов. В статическом конструкторе вы можете определить (и сохранить) всех своих покемонов.

 public class Pokemons
{
    static Pokemons()
    {
        // here you set variables for your Pokemon
        // Then you set the Pokemon to the static field
        Magikarp = new PokemonInfo(...);
    }

    public static readonly PokemonInfo Magikarp;
}
 

Где-то в вашем коде вы можете получить доступ к своим покемонам таким образом:

 var myPokemon = Pokemons.Magikarp;
 

Комментарии:

1. Итак, если мой класс Pokedex является статическим, содержит частную статическую фабрику и частный статический метод для получения информации, все будет хорошо: 3?

2. Пока вы не переназначите статические свойства или поля, сборщик мусора не удалит их.