簡體   English   中英

StackOverFlow 異常我不明白為什么?

[英]StackOverFlow Exception I don't get why?

//something is wrong with Parents setter property idk what :C, 
//i'm getting an exception when third ctor executes...

class Person     {
        public string Name { get;set; }
        public DateTime DateOfBirth { get; private set; }
        public IEnumerable<Person> Parents { get { return (Person[])Parents; } 
private set { Parents = value; } } // I'm getting StackOverFlow here BUT WHY ?

        public Person(string Name,DateTime DateOfBirth,Person[] parents=null)
        {
            this.Name = Name;this.DateOfBirth = DateOfBirth;Parents = parents;
        }
    }
    // Main class
    class Program
    {
        static void Main(string[] args)
        {
            //Creating 3 objects and get exception on third
            Person prs = new Person("Emily", DateTime.Now, null);
            Person prss = new Person("mark", DateTime.Now);
            Person psrs = new Person("maras", DateTime.Now, new[] { prs, prss });

            if (psrs.Parents != null)
            {
                foreach (var parent in psrs.Parents)              
                    Console.WriteLine();               
            }
            else Console.WriteLine("No parents");
        }
    }

// 另外一個問題:我的類實現是否符合 OOP 的所有原則? //好吧,也許是因為在構造函數和屬性中我做了完全相同的事情,但是如果我要在 ctor 中刪除 Parent = parents,我如何通過構造函數初始化我的Parents 屬性? 此外,如果我刪除了我的設置屬性,我將無法初始化Parents 屬性。 請幫忙 !

您的Parents屬性將自身設置在setter 您需要有適當的支持字段。

private IEnumerable<Person> _parents
public IEnumerable<Person> Parents 
{ 
    get { return (Person[])_parents; } 
    private set 
    { 
        _parents = value; 
    }
} 

編輯:您也可以只使用自動屬性,因為我認為不需要支持字段。

public IEnumerable<Person> Parents { get; private set; }

正如@crashmstr 所說, Parents正在引用自己.. 這里有一些解釋:

public IEnumerable<Person> Parents 
{ 
    get 
    { 
        return (Person[])Parents; 
    } 
    private set 
    { 
        Parents = value; 
    } 
}

使用 C# 時,類似這樣的屬性基本上被編譯成以下代碼:

public IEnumerable<Person> Parents_get()
{
    return (Person[])Parents.get();
}
public void Parents_set(IEnumerable<Person> value) 
{ 
    Parents_set(value);
}

這使它更清楚為什么它是自引用。

您可以簡單地將您的屬性定義為:

public IEnumerable<Person> Parents { get; set; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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