[英]Get an unexpected StackOverflow Exception when using properties and an inherited constructor
玩弄(出於教學原因) inheritance 和 C# 中的屬性得到了一個奇怪的異常。 對於專家來說應該是小菜一碟,但仍然讓我感到困惑。 這是我的代碼:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
public class Employee : Person
{
public int ID
{
get
{
return ID;
}
set
{
if (ID < 0 || ID > 999)
throw new Exception("Id must between [000-999]");
ID = value;
}
}
public Employee(string name, int age, int id):base(name, age)
{
ID = id;
}
}
static void Main(string[] args)
{
var per = new Person("John", 32);
var imp = new Employee("Michael", 44, 330);
}
執行我得到了一個 StackOverflow。 最后一個 StackTrace 指向 Employee class 內的 Employee.get_ID () 行有問題。
提前感謝您的任何幫助!
那么, ID
屬性返回自身
public int ID
{
get
{
return ID;
}
...
因此您有堆棧溢出:當您讀取ID
時,它調用ID
,而后者又調用ID
等。 set
的相同問題:您將值分配給屬性ID
,這導致將值分配給ID
等。為了打破這個惡性循環,讓我們介紹支持領域
private int m_ID;
public int ID
{
get
{
//DONE: now we just read m_ID, not call the property
return m_ID;
}
set
{
//DONE: you want to validate value, not ID, right?
//DONE: ArgumentOutOfRangeException - value is out of valid range
if (value < 0 || value > 999)
throw new ArgumentOutOfRangeException(nameof(value),
"Id must between [000-999]");
//DONE: we assign value to the field, not to the property
m_ID = value;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.