2014-05-23 167 views
-1

我想知道當一個屬性獲得{}時,它的容器類是如何創建的:當實例化類時,屬性是否會實例化?

public class MyClass 
{ 
    public MyProperty1 { get { return new MyClass1("Whatever"); } 
    public MyProperty2 { get { return new MyClass2("Whatever"); } 
    public MyProperty3 { get { return new MyClass3("Whatever"); } 
    // so on 
} 

所以,當我這樣做:

var myClass = new MyClass(); 

這是否初始化所有屬性(即新MyClass1的,新的MyClass2等),還是僅僅是創建/初始化,當我訪問他們像這樣:

myClass.MyProperty1.SomeMethodInsideMyClass1(); 

在這個例子中,可以說,任何方法使這個電話,只需要MyClass1的方法,但不休息,這就是爲什麼我想知道這是否會造成任何不必要的開銷。

+2

對象的屬性/函數/方法在您調用它之前不會執行。什麼會讓它認爲它呢? –

+1

我沒有給你-1,但你的問題不適合SO。所以如果對於有問題的人,他們正在尋找解決方案。在問題出現之前,你的問題屬於教具的範疇。人們來這裏是因爲他們有問題。 –

回答

6

屬性實際上是幕後的方法,因此,詢問它們是否被「實例化」是沒有意義的:方法從未實例化。

在您的示例中,只有在訪問屬性的getter方法時纔會創建ClassX的新實例。換句話說,如果某些用戶只需要MyProperty1,他實例化MyClass對象將而不是實例化其他任何東西。

實例化的時機完全取決於您的類的實現。在你的例子中,你在getter中創建一個新的實例。然而,這並不是唯一的出路:一個可以想見,預先初始化屬性爲私有字段,然後返回領域,像這樣:

public class MyClass 
{ 
    private readonly MyClass1 prop1 = new MyClass1("Whatever"); 
    private readonly MyClass2 prop2 = new MyClass2("Whatever"); 
    private readonly MyClass3 prop3 = new MyClass3("Whatever"); 
    public MyProperty1 { get { return prop1; } 
    public MyProperty2 { get { return prop2; } 
    public MyProperty3 { get { return prop3; } 
    // so on 
} 

這個實現是不同的 - 它實例前期所有的值爲的字段的屬性。但是,該類的這種行爲與其屬性無關。