2010-09-24 7 views
1

Il m'a fallu du débogage pour comprendre cela (ou je pense). Je vais laisser le code lâche sur vous et voir ce que vous venez avec. Il y a une classe simple Contact avec:Comportement C# inattendu avec autoproperties et constructeurs

  1. Certaines propriétés auto,
  2. Un constructeur paramétrés qui incrémente toujours la propriété Contact.ID et définit d'autres propriétés en fonction des arguments qu'il obtient
  3. Un constructeur parameterless qui appelle toujours le constructeur paramétré avec des valeurs par défaut.

D'abord voir le code; sa sortie et la question suit le code:

using System; 

class Program 
{ 
    private static void Main(string[] args) 
    { 
     Contact[] contacts_array = { 

     //Contact 0 
     new Contact(), 

     //Contact 1 
     new Contact { 
      Name = "contactName1", 
      Age = 40, 
      Email = "[email protected]" 
     }, 

     //Contact 2 
     new Contact { 
      Name = "contactName2", 
      Age = 41, 
      Email = "[email protected]" 
     }, 

     //Contact 3 
     new Contact("contactName3", 
      42, 
      "[email protected]"), 
     }; 

     foreach (var contact in contacts_array) 
     Console.WriteLine(contact); 

     Console.ReadLine(); 
    } 
} 

public class Contact 
{ 
    public static int totalContacts = 0; 
    public int Id { get; private set; } 
    public string Name { get; set; } 
    public int? Age { get; set; } 
    public string Email { get; set; } 

    public Contact() 
    { 
     new Contact("ANONYMOUS", null, "[email protected]"); 
    } 

    public Contact(string name, int? age, string email) 
    { 
     Id = Contact.totalContacts++; 
     Name = name; 
     Age = age; 
     Email = email; 
    } 

    public override string ToString() 
    { 
     return string.Format("[Contact: Id={0}, Name={1}, Age={2}, Email={3}]", 
          Id, Name, Age, Email); 
    } 
} 

Sortie:

[Contact: Id=0, Name=, Age=, Email=] 
[Contact: Id=0, Name=contactName1, Age=40, [email protected]] 
[Contact: Id=0, Name=contactName2, Age=41, [email protected]] 
[Contact: Id=3, Name=contactName3, Age=42, [email protected]] 

Question:

Pourquoi le Contact.ID == 0 dans les deuxième et troisième contacts plutôt être 1 et 2 respectivement, malgré que le constructeur paramétré soit toujours appelé et toujours incrémenter la propriété ID?

+0

@Brian: Vouliez-vous supprimer la classe Contact? La question n'a pas beaucoup de sens sans cela ... –

+0

@Jon: Doh! Merci. –

Répondre

6

Votre constructeur par défaut ne fait pas ce que vous pensez qu'il fait:

public Contact() 
{ 
    new Contact("ANONYMOUS", null, "[email protected]"); 
} 

Cela construira une nouvelle Contact puis défausse il, l'instance actuelle obtenir toutes les valeurs par défaut. Voici la syntaxe que vous recherchez:

public Contact() 
    : this("ANONYMOUS", null, "[email protected]") 
{ 
} 
+0

était embarrassamment rapide :) – explorer

+0

En fait ce qui m'a frustré était le fait que lorsque le constructeur par défaut appelait le constructeur paramétré le champ ID augmenterait pendant que j'étais là, mais quand le flux d'exécution retournerait au site d'appel tout disparaîtrait comme si rien ne s'était passé. – explorer

Questions connexes