我目前正在学习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。
答案 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();)
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;
}
}
}
}