2010-09-24 49 views
1

我花了一些调试来弄清楚(或者我认为)。我会让代码在你身上散开,看看你想出了什么。有一个简单的Contact类:意外的C#行为与自动属性和构造函数

  1. 一些自动特性,
  2. 一个参数的构造函数,根据它获得
  3. 参数的构造函数,它总是调用的参数总是递增Contact.ID财产,并设置其他属性具有默认值的参数化构造函数。

首先看代码;其输出与所述问题如下代码:

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

输出:

[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]] 

问题:

为什么Contact.ID == 0在第二和第三接触件而不是分别为1和2,尽管总是调用参数化的构造函数并始终增加ID属性?

+0

@Brian:你的意思是删除联系人类?没有它,这个问题没有什么意义...... – 2010-09-24 06:22:20

+0

@Jon:Doh!谢谢。 – 2010-09-24 06:24:17

回答

6

您的默认构造函数没有做什么你认为它的作用:

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

这将建立一个新的Contact然后丢弃它,当前实例将得到所有的默认值。这里是你之后的语法:

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

这是令人尴尬的快:) :) – explorer 2010-09-24 06:44:43

+0

实际上,让我感到沮丧的是,当默认构造函数调用参数化构造函数时,ID字段会在我处于这个位置时增加,但是当执行流程返回到调用网站时,一切都会消失,如果什么都没有发生。 – explorer 2010-09-24 06:51:37

相关问题