2014-09-25 120 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屬性,請將其忽略。一切仍然會正常工作。

相關問題