Неожиданное поведение C # с автопринадлежностями и конструкторами - PullRequest
1 голос
/ 24 сентября 2010

Мне потребовалась некоторая отладка, чтобы понять это (или я так думаю).Я дам вам код и посмотрю, что вы придумали.Существует простой класс Contact с:

  1. Некоторые авто-свойства,
  2. Параметризованный конструктор, который всегда увеличивает свойство Contact.ID и устанавливает другие свойства в соответствии с аргументамиполучает
  3. Конструктор без параметров, который всегда вызывает параметризованный конструктор со значениями по умолчанию.

Сначала посмотрите код;его вывод и вопрос следуют по коду:

 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 = "emailaddress1@email.com"
         },

         //Contact 2
         new Contact {
            Name = "contactName2",
            Age = 41,
            Email = "emailaddress2@email.com"
         },

         //Contact 3
         new Contact("contactName3",
            42,
            "emailaddress3@email.com"),
      };

      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, "ANONYMOUS@unknown.com");  
    }

    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);
    }
}

Вывод:

[Contact: Id=0, Name=, Age=, Email=]  
[Contact: Id=0, Name=contactName1, Age=40, Email=emailaddress1@email.com]  
[Contact: Id=0, Name=contactName2, Age=41, Email=emailaddress2@email.com]  
[Contact: Id=3, Name=contactName3, Age=42, Email=emailaddress3@email.com] 

Вопрос:

Почемуявляется Contact.ID == 0 во втором и третьем контактах, а не 1 и 2 соответственно, несмотря на то, что параметризованный конструктор всегда вызывается и всегда увеличивает свойство ID?

1 Ответ

6 голосов
/ 24 сентября 2010

Ваш конструктор по умолчанию не делает то, что вы думаете:

public Contact()
{
    new Contact("ANONYMOUS", null, "ANONYMOUS@unknown.com");
}

Это создаст новый Contact, а затем сбросит его , текущий экземпляр получит все значения по умолчанию. Вот синтаксис, который вы после:

public Contact()
  : this("ANONYMOUS", null, "ANONYMOUS@unknown.com")
{
}
...