2009-07-01 9 views
34

Avant le mot clé this est un deux-points. Quelqu'un peut-il expliquer ce que le côlon signifie dans ce contexte? Je ne crois pas que ce soit l'héritage.Que signifie ce deux-points (:)?

Merci

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

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

+0

MSDN couvre l'utilisation de la base et de ces mots-clés pour les constructeurs ici: http://msdn.microsoft. com/fr-fr/bibliothèque/ms173115 (VS.80) .aspx – rmoore

+1

Et aussi See- http://www.yoda.arachsys.com/csharp/constructors.html – RichardOD

Répondre

12

Il est constructeur CHAÎNAGE de sorte que le constructeur avec la chaîne volonté d'appel : this après la cteur qui correspond à la signature.

Donc, dans ce cas

public ListNode(object dataValue) 

appelle

public ListNode(object dataValue, ListNode nextNode) 

avec null comme deuxième param via : this(dataValue, null)

il est également intéressant de noter que le cteur appelé via le côlon exécute avant la ctor qui a été appelé pour initialiser l'objet.

+2

"cteur appelé exécute avant": C'est pourquoi Dans mes applications WinForms, je surcharge le constructeur et finit avec InitializeComponent() dans le constructeur avec tous les paramètres. Le constructeur par défaut appelle la surcharge et transmet les arguments par défaut. Habituellement, je vais finir avec une chaîne de (0 params) -> appels -> (1 param) -> appels -> (2 params) -> etc -> (la plupart des paramètres).En fournissant des cteurs vides comme "MainForm(): this (1, null) {}" Je finis avec peu de frais généraux, et je m'épargne de répéter le code dans les constructeurs. Prime. – maxwellb

50

Il (avec le mot-clé this) indique au constructeur d'appeler un autre constructeur dans le même type avant qu'il ne s'exécute lui-même.

Par conséquent:

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

devient efficace:

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

Notez que vous pouvez utiliser base au lieu de this de charger le constructeur d'appeler un constructeur dans la classe de base.

+0

7 ans plus tard .... Il semble que ce serait une utilisation de la méthode surchargée dans le cas d'utiliser 'this', est-ce exact? Si oui, pouvez-vous donner un exemple de cas d'utilisation? –

+0

que voulez-vous dire par «classe de base»? voulez-vous dire ceci: https://msdn.microsoft.com/en-us/library/system.type.basetype(v=vs.110).aspx? Im débutant alors s'il vous plaît soyez précis dans votre réponse :) – TechJS

8

Cela signifie avant de lancer le corps, exécuter le constructeur avec des paramètres d'objet et ListNode.

5

Il appelle l'autre constructeur ListNode. Vous pouvez faire une chose similaire avec le mot-clé base pour appeler un constructeur d'une classe dont vous dérivez.

2

Non, qui vous permet d'exécuter la surcharge constructeur existant (l'un avec deux paramètres), avant d'exécuter le corps du nouveau constructeur.

C'est la façon la plus simple de réutiliser le code constructeur dans plusieurs constructeur surcharges.

1

Le code est dit l'autre constructeur d'exécuter avec les arguments fournis avant que le corps du constructeur en cours est exécuté.

+0

Je pense que vous pensez à C++. C'est C#. –

+0

Doh. C'est ce qui arrive quand mon regard sur les tags est juste un peu trop rapide. –

+1

Puis-je suggérer d'éditer la partie C++ (qui est encore un peu confuse pour un développeur C#) ou de supprimer la réponse? –

1

Arguments de chaîne du constructeur. Il y a aussi ": base()" pour chaîner un appel à un constructeur sur le type de base.