2014-09-25 122 views
0

林是完全新的C#和试图建立在我创建的类/模型一个非常基本的应用程序:型号不包含一个构造函数8个参数

public class Customer 
    { 
     public int CustomerID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Address { get; set; } 
     public string Zipcode { get; set; } 
     public string City { get; set; } 
     public string Email { get; set; } 
     public string Phone { get; set; } 
    } 

现在,当我尝试实例化从另一个类的客户对象,像这样:

Customer c1 = new Customer(1, "Susan", "Peterson", "Borgergade 45", "8000", "Aarhus", "[email protected]", "21212121"); 

我得到:

'PetParadiseHotel.Models.Customer' 不包含一个常量 需要8个参数

从我的理解,应该有8个参数,所以这里有什么问题?

+2

您的客户类有一个默认的构造函数(带有零个参数),因为您尚未声明它。试试'new Customer(){CustomerID = 1,FirstName =“Susan”,....};' – 2014-09-25 19:11:07

+0

然后宣布它们会更好吗?那看起来怎么样? – Severin 2014-09-25 19:13:30

+0

'public Customer(int customerId,....){this.CustomerID = customerId; ...}' – 2014-09-25 19:15:24

回答

3

你必须为你的类创建一个构造器

public class Customer 
{ 
    public Customer(int customerID, string firstName, string lastName, string address, 
        string zipCode, string city, string email, string phone) 
    { 
     CustomerID = customerID; 
     FirstName = firstName; 
     // ... 
     Phone = phone; 
    } 
    public int CustomerID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
    public string Zipcode { get; set; } 
    public string City { get; set; } 
    public string Email { get; set; } 
    public string Phone { get; set; } 
} 

然后调用它(像你这样)

var customer = new Customer(1, "Susan", "Peterson", "Borgergade 45", "8000", "Aarhus", "[email protected]", "21212121"); 

或者你可以使用对象初始化:

var customer = new Customer() { CustomerID = 1, FirstName = "Susan" ... Phone = "21212121"} 
0

一般来说,我发现如果超过3个,那么这是一个对设计进行快速完整性检查的标志。如果超过5个,这是一个重大警告,说明设计可能有些问题。

但是,请注意“可能”一词 - 最后,唯一真正的规则是使用尽可能多的功能,不多也不少。总是有例外和情况下,更多的参数是最有意义的。

如果参数是以某种方式相关的,你应该将它们封装到一个容器类中。

2

如果没有定义明确的构造函数,C#类有一个默认的构造函数。它看起来基本上是这样的:

public class Customer 
{ 
    public Customer() 
    { 
    } 

    ... 
} 

换句话说,它什么都不做,真的没有任何参数。这可以让你新的它仅使用语法:

var customer = new Customer(); 

如果你希望能够在所有的这些值构造函数传递,你将不得不沿的线条创建自定义构造函数:

public class Customer 
{ 
    public Customer(int customerId, string firstName, string lastName, string address, string zipCode, string city, string email, string phone) 
    { 
     CustomerId = customerId; 
     FirstName = firstName; 
     LastName = lastName; 
     Address = address; 
     ZipCode = zipCode; 
     City = city; 
     Email = email; 
     Phone = phone; 
    } 

    ... 
} 

您还需要重新定义“默认”的构造函数,否则你就永远不能只是新的一个空Customer

public Customer() 
{ 
} 

此外,如果哟你只需要传递这些属性的一些子集,而不是每一个属性,你需要为每个子集创建额外的构造函数,或者为没有传入参数的构造函数提供默认值。总之,这是非常艰巨的,并且使维护成为血腥的噩梦。值得庆幸的是,C#也有所谓的对象初始化器语法。相反括号的,你用大括号,并设置每个属性要明确:

var customer = new Customer 
{ 
    CustomerId = 1, 
    FirstName = "Susan", 
    LastName = "Peterson", 
    ... 
} 

这种方法的好处是,你可以保持默认的构造函数,但仍然设置要每个属性“初始化”。此外,您可以指定要初始化的属性的任何子集,因此如果您不想设置Phone属性,请将其忽略。一切仍然会正常工作。

相关问题