2009-07-01 18 views
34

Antes de this la palabra clave es dos puntos. ¿Alguien puede explicar qué significa el colon en este contexto? No creo que esto sea inhertance.¿Qué significa este colón (:)?

Gracias

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

Ver http://stackoverflow.com/questions/338398/-thisfoo-syntax-in-c-constructors –

+0

El MSDN cubre el uso de la base y las palabras clave para los constructores aquí: http://msdn.microsoft. com/en-us/library/ms173115 (VS.80) .aspx – rmoore

+1

Y también vea- http://www.yoda.arachsys.com/csharp/constructors.html – RichardOD

Respuesta

12

Se encadenamiento constructor por lo que el constructor con la posterior cadena de voluntad : this llamada al ctor que coincide con la firma.

Así que en este caso

public ListNode(object dataValue) 

está llamando

public ListNode(object dataValue, ListNode nextNode) 

con null como el segundo parámetro a través : this(dataValue, null)

es también digno de mención que la ctor llamada a través del colon se ejecuta antes de la ctor que fue llamado para inicializar el objeto.

+2

"ctor se llama ejecuta antes": esta es la razón por la cual en mis aplicaciones WinForms, sobrecarga el constructor y termino con InitializeComponent() en el constructor con todos los parámetros. El constructor predeterminado llamará a la sobrecarga y pasará los argumentos predeterminados. Usualmente terminaré con una cadena de (0 params) -> calls -> (1 param) -> calls -> (2 params) -> etc -> (most params).Al suministrar ctors vacíos como "MainForm(): this (1, null) {}" termino sin demasiada sobrecarga, y me salvó de repetir código en los constructores. Prima. – maxwellb

50

(junto con la palabra clave this) le está dando instrucciones al constructor para que llame a otro constructor dentro del mismo tipo antes de que él mismo lo ejecute.

Por lo tanto:

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

se convierte efectivamente en:

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

Tenga en cuenta que se puede utilizar en lugar de basethis dar instrucciones al constructor para llamar a un constructor de la clase base.

+0

7 años después ... Parece que sería un uso de sobrecarga de método en el caso de usar 'this', ¿es correcto? Si es así, ¿puedes dar un ejemplo de un caso de uso? –

+0

¿qué quieres decir con 'clase base'? ¿Te refieres a esto: https://msdn.microsoft.com/en-us/library/system.type.basetype(v=vs.110).aspx? Soy novato así que por favor sé específico en tu respuesta :) – TechJS

8

Significa que antes de ejecutar el cuerpo, ejecute el constructor con los parámetros object y ListNode.

5

Llama al otro constructor ListNode. Puede hacer algo similar con la palabra clave base para llamar a un constructor de una clase de la que deriva.

2

No, eso le permite ejecutar la sobrecarga del constructor existente (la que tiene dos parámetros), antes de ejecutar el cuerpo del nuevo constructor.

Esa es la forma más simple de reutilizar el código de constructor en múltiples sobrecargas de constructor.

1

El código indica al otro constructor que se ejecute con los argumentos proporcionados antes de que se ejecute el cuerpo del constructor actual.

+0

Creo que estás pensando en C++. Esto es C#. –

+0

Doh. Eso es lo que sucede cuando mi mirada a las etiquetas es demasiado rápida. –

+1

¿Puedo sugerir que se edite la parte de C++ (que todavía es algo confuso para un desarrollador de C#) o que se elimine la respuesta? –

1

Argumentos de la cadena del constructor. También hay ": base()" para encadenar una llamada a un constructor en el tipo base.

Cuestiones relacionadas