在实例化类时,属性是否实例化?

时间:2014-05-23 00:21:27

标签: c#

我想知道当容器类是:

时是否创建了属性get {}

e.g。

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方法,但不需要其余方法,这就是为什么我想知道这是否会导致任何不必要的开销。

1 个答案:

答案 0 :(得分: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
}

此实现不同 - 它会事先为烘焙字段的字段实例化所有值。但是,类的这种行为与其属性无关。