2009-12-10 63 views
1

請幫我理解這一段代碼:C#示例語法問題

 protected Customer() 
    { 
    } 

在下面的類(Model類從樣品WPF MVVM應用程序):

public class Customer : IDataErrorInfo 
{ 
    #region Creation 

    public static Customer CreateNewCustomer() 
    { 
     return new Customer(); 
    } 

    public static Customer CreateCustomer(
     double totalSales, 
     string firstName, 
     string lastName, 
     bool isCompany, 
     string email) 
    { 
     return new Customer 
     { 
      TotalSales = totalSales, 
      FirstName = firstName, 
      LastName = lastName, 
      IsCompany = isCompany, 
      Email = email 
     }; 
    } 

    protected Customer()  // it is what I asked about 
    { 
    } 

    #endregion // Creation 
...... 
} 
+0

感謝所有回答。很難選擇被接受的答案(對不起,它只能是一個)。我對這段代碼的懷疑與創建實例的幾個構造函數的存在以及每個構造函數的特定目的有關。 – rem 2009-12-10 20:10:34

回答

3

您指向的那段代碼是constructor。每當在運行時創建類的實例時,這是一種(可能)自動調用的方法。

在這種情況下,它被標記爲protected keyword。這意味着只有所有者類加上任何派生類(即從它繼承的類)纔有權訪問它。

通過查看你的代碼,你的類中的兩個版本的CreateNewCustomer()靜態方法創建類的實例,調用構造函數。通過使構造函數受到保護,代碼保證類保持對實例化的獨佔控制;這意味着類(或其後代類)之外的其他代碼不能創建此類的實例。

2

的構造器這樣只有靜態創建方法才能真正實例化類。

+2

這是不正確的。類或其後代中的任何方法都可以調用受保護的構造函數。 – CesarGon 2009-12-10 19:39:25

+1

這是真的,你可以從這個類繼承,並讓那個類實例化... – jestro 2009-12-10 20:28:08

+0

你甚至不必繼承。你可以擁有另一個不受保護的ctor。 – 2009-12-11 16:23:58

4

protected Customer() { }是一個構造函數,它是一個特殊的方法,當你從一個類實例化一個對象時會自動被調用。在鍵入Customer c = new Customer()時,允許構造函數在運行時爲其分配並重置內存後初始化該實例。 protected關鍵字表示僅允許類Customer或其後代中的代碼使用該特定構造函數實例化所述類。

1

這意味着您的類的構造函數具有「受保護」訪問權限,這意味着只有此類或子類的成員才能調用它。實際上,這意味着要麼使用靜態方法創建此類的實例,要麼將另一個構造函數(可能位於派生類中)委託給此構造函數。

1

在構造函數中使用protected關鍵字只允許實例化自身內部的對象(如靜態工廠方法)以及從Customer派生的任何類中。