关于c#里面的base()的疑惑

来源:百度知道 编辑:UC知道 时间:2024/06/18 11:52:49
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace testIsAndAs
{
class Program
{
static void Main(string[] args)
{
SonClass sonClass = new SonClass();
Console.WriteLine(sonClass.i);

Console.ReadLine();
}
}

class BaseClass
{
public int i;
public int j;

public BaseClass()
{
i = 1;
j = 2;
}
}

class SonClass : BaseClass
{
public SonClass()
: base()
{
this.i = 22;
this.j = 5;
}
}
}
执行的时候输出是22,不是用base()标记了之后就执行父类的构造函数了吗?那为什么输出是22?如果是先调用父类的构造函数再调用子类的构造函数,那这个base()岂不是更可有可无了?因为编译器默认就是先调用父类的构造函数再调用子类的构造函数的啊

楼主的理解有误,base()关键字用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法,指定创建派生类实例时应调用的基类构造函数。有的时候甚至可当做初始化来用,显然是先条用base的

你这样写..当然可有可无啊~

因为你自己隐藏了 base.i ~ 所以i=22了~~

构造是有一定顺序的实现构造的.... 按基类派生类的顺序

当你不指定调用的时候...C#最先寻找默认构造函数调用~

class A1
{
public int i = 0;
public A1()
{
this.i = 1;
}
}

class A2 : A1
{
public int j = 0;
public A2()
{
this.j = 2;
}
}

A2 A2 = new A2();
Console.WriteLine(A2.i);

你可以理解成默认值,如果你的子类没赋值 只是调用,就会实现父类的。

一时很难给你说清楚,等你学了接口之后你可能会理解的深刻一点。

执行结果22,是因为先执行了BaseClass的构造函数,然后又执行了SonClass 的构造函数,不写: base(),也会调用父类的构造函数。你这种写法是显示调用,可以让代码更清晰,不写就是默认调用了。

C#里执行构造函数的顺序是从父--》子这样来执行的。最先调用最基类的构造函数,然后一层层往下执行。虽然你用了Base()来调用父类的构造函数,但是你在构造函数里有对i和j进行了初始化。所以你子类的构造函数会屏蔽父类的。
如果你就想用父类的构造函数,那里子类就直接用Base()就行了。