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

时间:2019-02-18 10:46:25

标签: c#

我目前正在学习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。

4 个答案:

答案 0 :(得分:3)

Player类现在有两件事:保存有关一名球员的信息,并且包含所有球员的球衣号码的列表。这两个中的一个不属于那里。

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

当然,您可以通过声明列表为静态列表来解决此问题,但这只是一个糟糕的设计; Player类需要了解一个玩家,而不是全部。

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

答案 1 :(得分:1)

您应该有一个静态数字列表。否则,每个玩家都有自己的有效号码列表。

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

这样,您就可以将所有播放器共享一个列表。

答案 2 :(得分:0)

您正在构造函数上使用AddToList方法添加正确的衬衫列表编号,但是在定义ShirtNo setter时,您没有添加到列表中 修复:

    public int ShirtNo
    {
        get { return _shirtNo;  }
        set
        {

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

                _shirtNo = value;
                AddToList(value)
            }
            else
            {
                _shirtNo = 0;
            }
        }
    }

答案 3 :(得分:0)

我将您的代码复制到本地计算机上进行调试。只需对您的

进行一些更改

1。必须将shirtNumbers列表声明为static,如果不是,那么对于每个玩家类实例,都将拥有List (私有静态List shirtNumbers = new List();)

  1. 您是直接给变量赋值,而不是两个构造函数中的属性都赋值。(getter setter在C#中称为property)。因此,不会调用setter内部的if条件。

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

    public void PrintPlayerInfo() 
    {
        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;
            }
        }
    }
}