我想知道当容器类是:
时是否创建了属性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方法,但不需要其余方法,这就是为什么我想知道这是否会导致任何不必要的开销。
答案 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
}
此实现不同 - 它会事先为烘焙字段的字段实例化所有值。但是,类的这种行为与其属性无关。