2014-05-23 116 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 
} 

这个实现是不同的 - 它实例前期所有的值为的字段的属性。但是,该类的这种行为与其属性无关。