2015-09-07 66 views
0

我想了解一些编程考试的代码,我偶然发现了这个表示法,我似乎找不到解释。 我搜索了stackoverflow,msdn和几个在线教程,但没有运气。C#对象初始化程序

的代码是这样的:

class A 
{ 
    public A(): this("b") 
    { 
     Console.WriteLine("c"); 
    } 

    public A(string i) 
    { 
     Console.WriteLine(i); 
    } 
} 

class B : A 
{ 
    public B() 
    { 
     Console.WriteLine("a"); 
    } 
    --------------- 
    static void Main(string[] args) 
    { 
     A b = new A(); 
    } 
} 

此,按说,打印出“BC”,但我甚至无法理解的继承和所有。我无法找出什么是这个符号在这里做:

public A(): this("b") 
{ 
    Console.WriteLine("c"); 
} 

我发现的唯一的事情,看上去类似远程的对象初始化,但只能在一个在线教程。为他们检查了MSDN - 没有类似的代码。任何人都可以帮忙?提前致谢!

+2

您是否阅读过有关构造函数语法的规范部分? –

+4

[它被称为''构造器链接''。](http://stackoverflow.com/questions/1814953/c-sharp-constructor-chaining-how-to-do-it) –

+0

什么'符号'特别是混淆给你? ':this(“b”)'将调用A类参数化构造函数,并简单地打印“b”,然后调用A无参数构造函数 - 打印“c”。 – Marcus

回答

2

这与对象初始值设定无关。其约为constructor-chaining。当任何方法(包括构造函数)都有这样一个this(...)你所说的是第一次调用与类似signatur的过载时,所以在你的情况下this("b")将首先调用这个ctor:public A(string i)。完成这个调用之后,在该特定构造函数中的实际工作将在您的excample Console.WriteLine("c");中完成。

+0

如果我正确地理解了这一点,调用的顺序将是:超类构造函数,链式超级构造函数,子类构造函数。但是如果我在子类中有匹配的构造函数,但超类中没有匹配构造函数呢?在给定的例子中,如果我有公共B(“M”){}并在Main()中调用它? – dzenesiz

+0

你必须提供任何类型的构造器链接,无论是隐含的还是明确的。在你的情况下,因为你已经有了一个具有匹配签名的基类构造函数('public A(string)'),那么在你的类'B'的ctor之前调用它。如果类'A'没有这样一个编译器,将会产生编译错误。这种链接确保每个派生的对象都被完全初始化,包括所有的基础成员。 – HimBromBeere