2010-06-21 44 views
2

基于我的问题 - 把下面的代码:C# - 如何创建一个构造函数,它们在声明之前接受变量?

class Nevermore60Customer: GenericCustomer 
{ 
    public Nevermore60Customer(string name, string referrerName) 
    : base (name) 
    { 
     this.referrerName = referrerName; 
    } 
    private string referrerName; 
    private uint highCostMinutesUsed; 

对我来说,它出现在变量“referrrerName”正在初始化“后,”它被作为构造函数传递的参数引用。

public Nevermore60Customer(string name, string referrerName) 

我是否在工作,如果是的话如何?或者如果我是正确的,并且在构造函数中被引用之后它正在被初始化,那怎么可能?

谢谢

回答

4

变量声明与构造函数比较的位置与C#无关。

这将使它更容易些讨论,如果你的参数和字段有不同的名称,但:

class Test 
{ 
    public Test(string parameter) 
    { 
     this.field = parameter; 
    } 

    private string field; 
} 

基本上领域的“存在”的构造函数被调用之前。如果字段声明了一个初始化,这样的:

private string field = "default value"; 

那么初始化运行之前的构造,即使它可能会后的源代码内。

+0

在声明你的“NeverMore60Customer”类并且使用F11的代码上放置一个断点可能有助于说明这里发生了什么 – 2010-06-21 12:05:49

0

不知道我明白这个问题。您的构造函数具有一个strign参数referrerName,您将其分配给一个私有类变量,也称为referrerName。我没有看到它的初始化之前引用this.referrerName?

0

this.referrerName指声明为private string referrerName;
referrerName=右侧的类成员为参数给构造。

0

无论您如何订购类的私有成员和构造函数都无关紧要,私有成员将始终首先被初始化。

0

C#是一种面向对象的语言,您似乎将C语言过程语言的概念与C#混淆了。与C不同,在C#中,只要实例在访问之前初始化并且在范围内,声明的顺序就不重要。

+0

那么,声明的顺序*可以*重要。特别是,初始化器是按照文本顺序执行的......当你有部分类时,它会变得不明确。当然,这依赖于这个几乎总是一个错误,但它可以有所作为。 *方法*(或构造函数或属性等)的位置没有定义的差异,我知道。 – 2010-06-21 12:05:26

+0

但它们都在构造函数之前初始化并可用。 – 2010-06-21 12:20:54

2

构造函数的参数是而不是该字段的别名。它隐藏字段名称,此代码将不起作用:

public Nevermore60Customer(string name, string referrerName) : base (name) 
    { 
     referrerName = referrerName; // bad 
    } 

通过使用“this”。前缀,您可以告诉编译器将参数值分配给该字段。这是一个非常普遍的模式,避免为该论点提出另一个名称。或者做一些尴尬的事情,比如用下划线前缀字段名称。

相关问题