簡體   English   中英

使用屬性和繼承的構造函數時出現意外的 StackOverflow 異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM