2009-12-10 60 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派生的任何类中。