2009-07-01 3 views
34

До ключевого слова this - это двоеточие. Может ли кто-нибудь объяснить, что означает двоеточие в этом контексте? Я не считаю, что это наследование.Что это за двоеточие (:) означает?

Благодаря

using System; 

namespace LinkedListLibrary 
{ 
    class ListNode 
    { 
     private object data; 
     private ListNode next; 

     public ListNode(object dataValue) 
      : this(dataValue, null) 
     { 
     } 

     public ListNode(object dataValue, ListNode nextNode) 
     { 
      data = dataValue; 
      next = nextNode; 
     } 

     public ListNode Next 
     { 
      get 
      { 
       return next; 
      } 
      set 
      { 
       next = value; 
      } 
     } 
     public object Data 
     { 
      get 
      { 
       return data; 
      } 
     } 


    } 
} 
+1

См. Http://stackoverflow.com/questions/338398/-thisfoo-syntax-in-c-constructors –

+0

MSDN охватывает использование базы и этих ключевых слов для конструкторов здесь: http://msdn.microsoft. com/en-us/library/ms173115 (VS.80) .aspx – rmoore

+1

А также см. http://www.yoda.arachsys.com/csharp/constructors.html – RichardOD

ответ

12

Это конструктор, поэтому цепной конструктор с последующей : this вызова цепью к CTOR, который соответствует подписи.

Таким образом, в данном случае

public ListNode(object dataValue) 

зовут

public ListNode(object dataValue, ListNode nextNode) 

с нулевым как вторыми парами через : this(dataValue, null)

Также стоит отметить, что т е р вызывается через толстую кишку выполняется до ctor, который был вызван для инициализации объекта.

+2

«ctor, вызываемый выполняется до»: Вот почему в моих приложениях WinForms я перегружаю конструктор и заканчиваю с InitializeComponent() в конструкторе со всеми параметрами. Конструктор по умолчанию вызовет перегрузку и передаст аргументы по умолчанию. Обычно я завершаю цепочку из (0 params) -> calls -> (1 param) -> calls -> (2 params) -> etc -> (большинство параметров).Предоставляя пустые ctors, такие как «MainForm(): this (1, null) {}« Я получаю не слишком много накладных расходов и сохраняю себя от повторения кода в конструкторах. Бонус. – maxwellb

50

Он (вместе с ключевым словом this) инструктирует конструктор для вызова другого конструктора того же типа перед тем, как он сам выполняет.

Поэтому:

public ListNode(object dataValue) 
    : this(dataValue, null) 
{ 
} 

фактически становится:

public ListNode(object dataValue) 
{ 
    data = dataValue; 
    next = null; 
} 

Обратите внимание, что вы можете использовать base вместо this поручить конструктор вызвать конструктор базового класса.

+0

Спустя 7 лет .... Похоже, это будет использование перегрузки метода в случае использования 'this', это правильно? Если да, можете ли вы привести пример прецедента? –

+0

Что вы подразумеваете под «базовым классом»? вы имеете в виду это: https://msdn.microsoft.com/en-us/library/system.type.basetype(v=vs.110).aspx? Im новичок, пожалуйста, будьте конкретны в своем ответе :) – TechJS

8

Это означает, что перед запуском тела запустите конструктор с объектами и параметрами ListNode.

5

Он вызывает другой конструктор ListNode. Вы можете сделать аналогичную вещь с ключевым словом base, чтобы вызвать конструктор класса, из которого вы извлекаете.

2

Нет, это позволяет выполнить существующую перегрузку конструктора (тот, у которого два параметра), перед выполнением тела нового конструктора.

Это самый простой способ повторного использования кода конструктора при перегрузках нескольких конструкторов.

1

Код сообщает другому конструктору выполнить с предоставленными аргументами, прежде чем тело текущего конструктора будет исполнено.

+0

Я думаю, вы думаете о C++. Это C#. –

+0

Дох. Это то, что происходит, когда мой взгляд на теги просто слишком быстр. –

+1

Могу я предложить либо отредактировать часть C++ (что еще несколько запутывает разработчика C#), либо удалить ответ? –

1

Конструктор цепных аргументов. Существует также «: base()» для привязки вызова к конструктору базового типа.

Смежные вопросы