初始化基类构造函数中的继承成员如何减少对...的调用?

flo*_*ode 1 c#

我已经读过,而不是_c1在派生构造函数中初始化继承成员(在我们的示例中):

class A
{
    public int _c;
}

class B:A
{
    public B(int c)
    {
        _c = c;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们应该在基类构造函数中初始化它们,因为这样我们减少了对继承成员的调用(_c):

class A
{
    public A(int c)
    {
        _c = c;
    }
    public int _c;
}

class B:A
{
    public B(int c)
        : base(c)
    {


    }
}
Run Code Online (Sandbox Code Playgroud)

如果_c在基础构造函数内初始化字段,则初始化顺序如下:

1)首先B调用派生类的
字段初始值设定项2)然后调用基类的字段初始值设定项A(此时_c设置为值0)
3)B’s调用A’s构造函数,然后调用自定义构造函数
4)_c字段设置为值参数c(在A’s自定义构造函数内)
5)一旦A’s自定义构造函数返回,B’s构造函数就会执行其代码.

如果_cB's构造函数内初始化字段,则初始化顺序如下:

1)首先B调用派生类的
字段初始值设定项2)然后调用基类的字段初始值设定项A(此时_c设置为值0)
3)B’s调用A’s构造函数,然后调用默认构造函数
4)一旦A’s自定义构造函数返回,B’s构造函数将_c字段设置为参数值c

据我所知,在两种情况下都被_c调用了两次,那么我们究竟是如何减少对继承成员的调用_c呢?

感谢名单

Mar*_*ell 5

问题从这里开始:

public int _c;
Run Code Online (Sandbox Code Playgroud)

字段不应该是公共的,所以为了正确地执行此操作,您将拥有一个属性,因此您必须调用set访问器.我认为他们要强调的是:

private int c;
public int C {get {return c;} set {this.c=value;} } // ld, ld, st
public Foo(int c) {this.c = c;} // ld, ld, st
...
Foo foo = new Foo(blah); // ld, newobj, st
Run Code Online (Sandbox Code Playgroud)

(这确实一个字段赋值内部构造)

VS

private int c;
public int C {get {return c;} set {this.c=value} } // ld, ld, st 
public Foo() {}
...
Foo foo = new Foo(); // newobj, st
foo.C = blah; // ld, ld, callvirt
Run Code Online (Sandbox Code Playgroud)

然而!这都是微观优化.通常,内联的get/set访问器将被内联 - 因此在现实中几乎没有差别.我很乐意拥有:

public int C {get;set;}
Run Code Online (Sandbox Code Playgroud)