C # - как можно создать конструктор, который принимает переменные, прежде чем они объявлены? - PullRequest
2 голосов
/ 21 июня 2010

Исходя из моего вопроса - возьмите следующий код:

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)

Я беспокоюсь, и если да, то как?Или, если я прав, и он инициализируется после ссылки на него в конструкторе, как это возможно?

Спасибо

Ответы [ 6 ]

4 голосов
/ 21 июня 2010

Положение объявления переменной по сравнению с конструктором не имеет значения для C #.

Было бы проще обсудить это, если бы у вас были разные имена для параметра и поля:

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

    private string field;
}

По сути, поле «существует» до вызова конструктора. Если поле объявлено с инициализатором, например так:

private string field = "default value";

тогда этот инициализатор запускается перед конструктором, даже если он может следовать за ним в исходном коде.

2 голосов
/ 21 июня 2010

Аргументом конструктора является , а не псевдоним для поля.Он скрывает имя поля, этот код не будет работать:

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

Используя «this».префикс, вы можете сказать компилятору присвоить значение аргумента полю.Это очень распространенный шаблон, избегающий необходимости придумывать другое имя для аргумента.Или сделайте что-то неловкое, например, добавив префикс имени поля, скажем, через подчеркивание.

0 голосов
/ 21 июня 2010

C # - объектно-ориентированный язык, и вы, кажется, путаете понятия простого процедурного языка C с C #.В отличие от C, в C # порядок объявления не имеет значения, если экземпляр инициализируется перед доступом и находится в области видимости.

0 голосов
/ 21 июня 2010

Неважно, как вы заказываете закрытые члены класса и конструктора, закрытые члены всегда будут инициализироваться первыми.

0 голосов
/ 21 июня 2010

this.referrerName относится к члену класса, объявленному как private string referrerName;
referrerName справа от = является параметром для конструктора.

0 голосов
/ 21 июня 2010

Не уверен, что понимаю вопрос. Ваш конструктор имеет параметр strign, referrerName, который вы назначаете для переменной частного класса, также называемой referrerName. Я не вижу, где ссылка this.referrerName перед его инициализацией?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...