首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用静态类和重写值

使用静态类和重写值
EN

Stack Overflow用户
提问于 2017-06-04 10:47:19
回答 1查看 26关注 0票数 0

我正在从文件中读取宠物的列表,我有一个简单的文本文件,它的每个属性都有一个新的行。它完整地阅读了我的第一个宠物,并使用我的字典创建了这个宠物。然而,当它清除这两个列表时,它会清除第一个创建的宠物的这些详细信息,并且当读取第二个宠物的详细信息时,它们最终具有匹配的特征,这对我的所有8个宠物都是如此。我知道当我清除我的列表时,它会为我之前创建的宠物清除它,但是为什么它不同时覆盖这个名字呢?我是OOP的新手,所以如果我听起来完全不称职,请原谅。

代码语言:javascript
复制
public static List<Pet> LoadPetDetails(string filename)
    {
        RegisterPet("Sheep", typeof(Sheep));
        RegisterPet("Dog", typeof(Dog));
        RegisterPet("Cat", typeof(Cat));
        RegisterPet("Rabbit", typeof(Rabbit));

        StreamReader reader = new StreamReader(filename);
        string kind, name, id, breed, desc;
        int age;
        bool gender;
        petSize size;
        List<string> petTraits = new List<string>();
        List<string> require = new List<string>();
        List<Pet> loadedPets = new List<Pet>();

        try
        {
            //read in the count of how many pets in care currently
            int count = Convert.ToInt32(reader.ReadLine());

            //read in details for pet 1 through to we reach the count 
            for (int j = 1; j <= count; j++)
            {
                //clear both of these list from the previous pet
                petTraits.Clear();
                require.Clear();

                //read in the kind
                kind = reader.ReadLine();
                //read in name
                name = reader.ReadLine();
                //read in id
                id = reader.ReadLine();
                //read in the pet traits
                for (int i = 0; i <= 2; i++)
                    petTraits.Add(reader.ReadLine());
                //read in pet breed
                breed = reader.ReadLine();
                //read in the pet's description
                desc = reader.ReadLine();
                //read in list of requirments
                for (int i = 0; i <= 1; i++)
                    require.Add(reader.ReadLine());
                //read in age
                age = Convert.ToInt32(reader.ReadLine());
                //read in size
                size = ConvertToPetSize(reader.ReadLine());
                //read in gender
                gender = Convert.ToBoolean(reader.ReadLine());

                //create the pet and add it to the list of pets to return
                loadedPets.Add(Pet.CreatePet(kind, name, id, petTraits, breed, desc, require, age, size, gender));
            }
        }
        finally
        {
            reader.Close();
        }
        return loadedPets;
    }
EN

回答 1

Stack Overflow用户

发布于 2017-06-04 11:05:46

在CreatePet中的某个地方,您可能有一些像pet.Traits = petTraits;这样的代码。您正在将对同一列表的引用传递给您的函数创建的所有宠物。有两种方法可以解决这个问题,最简单的方法是像pet.Traits = petTraits.ToList();一样在CreatePet()中创建一个列表副本

更好的解决方案是声明所有临时变量(种类、名称、petTraits等)。在你的for循环中。在C#中,您更喜欢让变量在尽可能短的生命周期范围内存在。避免这样的bug比重用变量带来的一些微小的性能优势更重要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44350307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档