下面两种字段初始化方式有什么区别吗?什么时候使用哪一个?
第一种方式
public class Class1
{
private SomeClass someclass;
public Class1()
{
someclass = new SomeClass(some arg);
}
}
第二种方式
public class Class1
{
private SomeClass someclass = new SomeClass(some arg);
}
第二个示例中的字段可以是只读的。
您不能使用this
内联初始化字段时的关键字。其原因在于代码执行的顺序:出于所有意图和目的,内联初始化字段的代码在类的构造函数之前运行(即 C# 编译器将阻止访问this
关键词)。基本上这意味着这不会编译:
public class Class1
{
private SomeClass someclass = new SomeClass(this);
public Class1()
{
}
}
但这将:
public class Class1
{
private SomeClass someclass;
public Class1()
{
someclass = new SomeClass(this);
}
}
这是一个微妙的差异,但值得一记。
这两个版本之间的其他差异只有在使用继承时才会真正引人注目。如果有两个相互继承的类,则将首先初始化派生类中的字段,然后初始化基类中的字段,然后调用基类的构造函数,最后调用将调用派生类。在某些情况下,您需要对此非常小心,因为如果您没有意识到发生了什么,可能会导致复杂的水果沙拉(其中之一涉及在基类构造函数中调用虚拟方法,但是几乎从来都不是明智之举)。这是一个例子:
class BaseClass
{
private readonly object objectA = new object(); // Second
private readonly object objectB;
public BaseClass()
{
this.objectB = new object(); // Third
}
}
class DerivedClass : BaseClass
{
private object objectC = new object(); // First
private object objectD;
public DerivedClass()
{
this.objectD = new object(); // Forth
}
}
您需要在初始化字段的所有行上设置断点才能看到正确的顺序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)