C# 基本关键字在构造函数初始化中实际起什么作用?
我被C#中的C# 基本关键字在构造函数初始化中实际起什么作用?,c#,constructor,C#,Constructor,我被C#中的base关键字弄糊涂了。假设我有如下代码: class A { // member declaration.... A(int s, int t, int x) { // assign the values of members } } class B : A { // member declaration.... B(int a, int b, int c, int d) : base(a,b,c)
base
关键字弄糊涂了。假设我有如下代码:
class A
{
// member declaration....
A(int s, int t, int x)
{
// assign the values of members
}
}
class B : A
{
// member declaration....
B(int a, int b, int c, int d) : base(a,b,c)
{
// does the base keyword play a role in
// this constructor?
}
}
现在,在B
的构造函数中base
关键字的确切用法是什么?我有几个问题要澄清:
base
关键字将调用基类A
构造函数(在我们的示例中)?这是正确的吗base
关键字会更改派生类构造函数的行为吗base
关键字时(一些示例会很好)
编辑:
我还有一个问题。我如何通过base
关键字通知base
类我们的派生的类
提前感谢。是-base
链接到基类中的构造函数
如果不指定base
或this
(链接到同一类中的另一个构造函数),其效果就如同将base()
链接到基类中的无参数构造函数一样。在您的示例中,这将导致编译失败,因为您的基类没有无参数构造函数
有关更多信息,请参阅我的
是的,这将调用基类构造函数
派生构造函数总是调用基类构造函数;如果不指定,它将尝试调用无参数构造函数(如果存在)。此语法允许您将参数传递给特定的基类构造函数。请注意,在本例中,没有不带参数的公共或受保护的基类构造函数,因此需要使用带参数的“base”语法
我认为基本原则非常明确
:
base关键字用于从派生类中访问基类的成员:
- 对已被另一个方法重写的基类调用方法
- 指定在创建派生类的实例时应调用哪个基类构造函数
我有一个疑问,那么通过base
关键字向base
类通知我们的派生的类的基本用途是什么呢,通过在派生类中添加其他功能,然后在派生类中执行该功能,您正在扩展基构造函数。@Ant:派生类实例初始化的一部分是运行基类的初始化步骤。想象一下,如果它没有这样做,但是您的示例中A
的构造函数正在设置一些字段-突然您会尝试使用B
的一个实例(这是A
的一个实例),而没有完全初始化。派生构造函数可能会间接调用它,通过同一类中的另一个构造函数,使用this
@Jon,很好;您是否知道这是否在抖动/验证级别强制执行?我知道您需要显式地向基类构造函数发出IL调用,但我从来没有尝试过发出一个没有发出调用的构造函数。
public class BaseClass
{
int num;
public BaseClass()
{
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int i)");
}
public int GetNum()
{
return num;
}
}
public class DerivedClass : BaseClass
{
// This constructor will call BaseClass.BaseClass()
public DerivedClass() : base()
{
}
// This constructor will call BaseClass.BaseClass(int i)
public DerivedClass(int i) : base(i)
{
}
static void Main()
{
DerivedClass md = new DerivedClass();
DerivedClass md1 = new DerivedClass(1);
}
}
/*
Output:
in BaseClass()
in BaseClass(int i)
*/