首页 > 解决方案 > 列表不断重置为空。我怎样才能解决这个问题?

问题描述

我目前正在学习 C#,并指定自己制作一个程序来帮助我理解 OOP,它本质上接受值并将它们分配给变量。该程序接收有关足球运动员的信息;姓名、姓氏、职位和球衣号码。

我正在尝试使用 getter 和 setter 来确保衬衫号码只能使用一次。所以我设置了一个列表,存储所有正在使用的衬衫号码。我遇到的问题是:列表不断重置,我不知道为什么。添加一个值后,在添加下一个值时,列表再次为空。这使得我在 setter 中的 if 语句不起作用,因为列表不包含任何值。

我确定这是一个新手错误,应该对我大喊大叫,但我对这门语言很陌生,对它的所有来龙去脉都不太确定。

我并没有真正尝试太多,我在网上找不到任何东西,因为这似乎是我遇到的一个特定错误。我对语言的了解不足以正确解决此问题,而我对语言的了解告诉我这应该可以工作。

namespace RandomObject
{
    class Program
    {
        static void Main(string[] args)
        {
            Player player1 = new Player("Lucas", "Torreira", "Defensive Midfielder", 11);
            Player player2 = new Player("Alexandre", "Lacazette", "Striker", 9);
            Player player3 = new Player("Pierre-Emerick", "Aubameyang", "Striker", 14);
            Player player4 = new Player();

            Console.Write("Please enter new players first name: ");
            player4.Name = Console.ReadLine();
            Console.Write("Please enter new players last name: ");
            player4.LastName = Console.ReadLine();
            Console.Write("Please enter new players position: ");
            player4.Position = Console.ReadLine();
            Console.Write("Please enter new players shirt number: ");
            player4.ShirtNo = Convert.ToInt32(Console.ReadLine());


            player1.PrintPlayerInfo();
            player2.PrintPlayerInfo();
            player3.PrintPlayerInfo();
            player4.PrintPlayerInfo(); 

            Console.ReadKey();
        }
    }
}  

class Player
    {
        private List<int> shirtNumbers = new List<int>();
        private int _shirtNo;

        public void PrintPlayerInfo() //<access modifier> <return type> <method name>(parameters)
        {
            Console.WriteLine("Player: {0} {1}", Name, LastName);
            Console.WriteLine("Position: {0}", Position);
            Console.WriteLine("Shirt No.: {0}\n", _shirtNo);
        }


        public Player()
        {
            Name = string.Empty;
            LastName = string.Empty;
            Position = string.Empty;
            _shirtNo = 0; 
        }


        public Player(string name, string lastName, string position, int shirtNo)
        { 

            Name = name;
            LastName = lastName;
            Position = position;
            _shirtNo = shirtNo;

            AddToList(_shirtNo);

        }

        private void AddToList(int newNumber)
        {
            shirtNumbers.Add(newNumber);
            Console.WriteLine(shirtNumbers[0]);
        }


        public string Name { get; set; }
        public string LastName { get; set; }
        public string Position { get; set; }
        public int ShirtNo
        {
            get { return _shirtNo;  }
            set
            {

                if (shirtNumbers.Contains(value) == false)
                {

                    _shirtNo = value;

                }
                else
                {
                    _shirtNo = 0;
                }
            }
        }
    }
} 

在我的主要方法中,我声明了该类的 3 个实例,衬衫编号为 11、9 和 14。因此,当使用 readlines 等将一个输入到控制台时,如果我要输入 14,则应设置衬衫编号为 0。但是,如果我输入 10,则应将其设置为 10。

标签: c#

解决方案


这个Player类现在做了两件事:它包含一个球员的信息,它包含所有球员的球衣号码列表。这两个中的一个不属于那里。

是一个实例变量,这private List<int> shirtNumbers = new List<int>();意味着每个球员都有自己的球衣号码列表。因此,如果您将一件衬衫分配给玩家 X,那么玩家 Y 的实例中的列表没有这个概念,因此您可以将衬衫 N 分配给玩家 X 和 Y。

当然,您可以通过将列表声明为静态来解决此问题,但这只是糟糕的设计;Player班级需要了解一名球员,而不是所有球员。

因此,请将此球衣号码检查保留您的球员类别之外。在球员名单之前声明球衣名单,并相应地修改你的代码。


推荐阅读