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。
解决方案
这个Player
类现在做了两件事:它包含一个球员的信息,它包含所有球员的球衣号码列表。这两个中的一个不属于那里。
是一个实例变量,这private List<int> shirtNumbers = new List<int>();
意味着每个球员都有自己的球衣号码列表。因此,如果您将一件衬衫分配给玩家 X,那么玩家 Y 的实例中的列表没有这个概念,因此您可以将衬衫 N 分配给玩家 X 和 Y。
当然,您可以通过将列表声明为静态来解决此问题,但这只是糟糕的设计;Player
班级需要了解一名球员,而不是所有球员。
因此,请将此球衣号码检查保留在您的球员类别之外。在球员名单之前声明球衣名单,并相应地修改你的代码。
推荐阅读
- java - 为什么我的链接到 Jar 的文件可以在 VS 代码中工作,但不能在终端中工作
- list - 如何在 for 循环中创建 dict?Python
- python - 为什么我在从文本文件导入列表的字符串中得到 \\n?
- api - 如何使用他们的 API 获取 Linkedin 个人资料数据?
- google-drive-shared-drive - 如何通过gshell软件访问共享驱动器?
- firebase - Flutter FCM 推送通知 - 前台通知点击事件
- swift - 为什么模拟响应无法解码?
- r - Need help on how to sort a tibble column by keyword in R
- firebase - Cant login using phone authentication in IOS - Flutter
- typescript - 让在 Promise 构造函数中分配的变量被 Typescript 标记为未定义