字段初始化

2023-12-29

下面两种字段初始化方式有什么区别吗?什么时候使用哪一个?

第一种方式

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(使用前将#替换为@)

字段初始化 的相关文章

随机推荐