Проблема заключается в вашей недвижимости в PlayerDataClass
!!
. Внимательно посмотрите, что здесь происходит:
public string Name
{
get
{
return Name;
}
set
{
Name = value;
}
}
public int Score
{
get
{
return Score;
}
set
{
Score = value;
}
}
public DateTime DateOfPlaying
{
get
{
return DateOfPlaying;
}
set
{
DateOfPlaying = value;
}
}
Каждый раз, когда вы читаете свойства значение его геттера называется; каждый раз, когда вы присваиваете ему значение, вызывается его установщик. Даже в этом случае, если это чтение или присвоение происходит внутри этих методов получения или установки.
Допустим, например, что вы хотите, например, присвоить значение Name
.
Итак, что происходит, это
set
{
Name = value;
}
, где вы снова присваиваете значение свойству Name
, чтобы оно вызывало установщик этого свойства снова и снова в рекурсивном бесконечном l oop! По сути, то, что вы здесь сделали, равно вызову метода, подобному
public void SetName(string value)
{
SetName(value);
}
То же самое произошло бы для чтения любого из этих свойств, поскольку, например,
get
{
return Name;
}
равно методу, подобному
public string GetName()
{
return GetName();
}
Приложение рушится, потому что вы делаете это уже в конструкторе PlayerDataClass
, поэтому не имеет значения, в каком методе ... как только вы вызываете new PlayerDataClass(x, y)
, конструктор вызывает бесконечное l oop!
В вашем случае вам фактически не нужны никакие свойства, вы можете просто сделать это простыми полями:
public class PlayerDataClass
{
public string Name;
public int Score;
public DateTime DateOfPlaying;
// constructor
public PlayerDataClass(string playerName, int playerScore)
{
Name = playerName;
Score = playerScore;
DateOfPlaying = DateTime.Today; // set the date to be current date
}
}
Использование свойств на самом деле имеет смысл, только если вы a) хотите реализовать некоторые особые действия, такие как проверка значения в получателе и / или установщике, или б) хотят ограничить доступ, например, разрешить только чтение publi c Propert ie, но присвоить значение только private. Во всех остальных случаях вы должны просто использовать поля.
или , если , если вы хотите использовать свойства, используйте либо автопринадлежности (я буду использовать примеры, чтобы показать ограничения доступа)
public class PlayerDataClass
{
// this one can be assigned from any class also afterwards
public string Name {get; set; }
// This one can be assigned afterwards but only from this class
// e.g. via a method, it is read-only for any other class
public int Score {get; private set; }
// This one can only be assigned in the constructor of this class
// and not be changed by anyone afterwards
// it is read-only for any other class and this one except for the constructor
public DateTime DateOfPlaying {get; }
// constructor
public PlayerDataClass(string playerName, int playerScore)
{
Name = playerName;
Score = playerScore;
DateOfPlaying = DateTime.Today; // set the date to be current date
}
}
или используйте свойства с вспомогательным полем, как (те же примеры ограничения доступа, что и раньше)
public class PlayerDataClass
{
private string name;
private int score;
private DateTime dateOfPlaying;
public string Name
{
get { return name; }
set { name = value; }
}
public int Score
{
get { return score; }
private set { score = value; }
}
public DateTime DateOfPlaying
{
get { return dateOfPlaying; }
}
// constructor
public PlayerDataClass(string playerName, int playerScore)
{
name = playerName;
score = playerScore;
dateOfPlaying = DateTime.Today; // set the date to be current date
}
}