【问题标题】:Is this a constructor declaration?这是构造函数声明吗?
【发布时间】:2017-03-17 14:13:54
【问题描述】:

我是 C# 语言的新手,在一个网站上遇到过这种声明。我之前没见过这种类型的构造函数(?),所以我真的很困惑:

  public class Employee { 

  public string Name { get; set; } 
  public string Title { get; set; }  

  public static Employee GetEmployee() {          //Constructor? Method?
     var emp = new Employee() { 
        Name = "Somebody", Title = "Developer" 
     }; 
     return emp;                                  //Returns to a method? 

非常感谢。

【问题讨论】:

  • 它不是构造函数。只是一个静态方法
  • 如果你对设计模式感兴趣的话,它的另一个名字是factory method

标签: c# class oop methods constructor


【解决方案1】:
//Constructor? Method?

方法。静态方法。

此模式通常与 private 构造函数结合使用:

public static Employee GetEmployee()
{
    return new Employee()
    { 
        Name = "Somebody", Title = "Developer" 
    }; 
}

private Employee() { }

私有构造函数确保类的实例只能通过使用其中一种静态方法来创建。

这样的“工厂方法”比构造函数更灵活:

  • 它可以返回子类的实例(通常与私有的内部子类一起使用),
  • 它有一个名字,可以增加可读性,并允许您拥有多个具有相同参数列表但名称不同的工厂方法(例如GetDeveloper()GetManager())。

但是,它也有一个缺点:您只能在构造函数中设置readonly 字段。因此,如果Employee 是具有只读字段的不可变类,则在使用此模式时需要将所有值传递给私有构造函数。

【讨论】:

    【解决方案2】:

    这不是一个构造函数,而只是一个普通的静态方法。

    public class Employee 
    { 
        //Default constructor
        public Employee()
        {
            Name = "Some other name";
            Title = "Some other title";
        }
    
        //Static constructor
        static Employee()
        {
    
        }
    
        //Just a static method returning an Employee object
        public static Employee GetEmployee() 
        {      
            //Object initializer using the default constructor   
            var emp = new Employee() 
            { 
                Name = "Somebody", 
                Title = "Developer" 
            }; 
            return emp;
        }
    
        public string Name { get; set; } 
        public string Title { get; set; } 
    } 
    

    【讨论】:

      【解决方案3】:

      我猜你是在问对象初始化器。它不是构造函数,而是静态方法调用默认构造函数,然后使用对象初始化器语法在新对象上设置两个属性。

      如果你必须给方法命名,你会称它为工厂方法。该方法没有什么特别之处,它只是一个返回新对象实例的静态方法。它恰好实现了一种称为工厂模式的通用软件模式。

      工厂模式有一些常见的用途。最近出现的一个例子是有时我想创建一个新的对象实例,有时我想返回一个现有的实例。工厂模式以对调用者透明的方式支持这一点。另一个常见用途是当调用者不知道要创建的特定类型时 - 调用者可能只需要对接口或基类的引用,而工厂决定要实例化的特定类。

      【讨论】:

        【解决方案4】:

        您在代码中看到的是一个简单的静态函数,它创建对象的一个​​实例,虽然它是完整的,但应该通过将构造函数设为私有来隐藏创建 Employee 对象的能力,因为构造函数的默认行为是公开的

        如果一个类不包含实例构造函数声明,则默认 实例构造函数是自动提供的。该默认值 构造函数只是调用直接的无参数构造函数 基类。

        来自MSDN

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-25
          • 2020-09-13
          • 2022-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多