有没有比在构造函数中作为参数发送更好的方法来设置许多必需的属性?

时间:2010-04-28 15:37:33

标签: c#

我有一个课程,为了做到这一点,工作需要设置8个不同的属性值。 我想确保在尝试执行方法之前设置了所有8个属性。 我目前已经传入了所有参数并通过构造函数进行设置。 有更好的方法吗?

9 个答案:

答案 0 :(得分:9)

您可以在不指定所有属性的值的情况下允许创建对象,然后如果在对象状态对于要执行的方法调用有效之前调用,则该方法将抛出InvalidOperationException,在这种情况下,意味着所有8个属性都有有效值。

这样,您可以为消费者提供更多灵活性。它可以在一个时刻创建一个新实例,在另一个时刻设置它的属性,然后再调用该方法。这是一个“模式”,通过.NET代码库使用,开发人员已经使用过。


<强>更新

如果您要添加其他不需要初始化的完整属性集的方法,这也可以简化操作。是的,我们可以使用新的属性集添加另一个构造函数重载,但是如果我们有两个方法都需要一个相同类型的属性进行初始化呢?使用构造函数重载无法解决这个问题。

答案 1 :(得分:3)

在我看来,如果一个类需要这8个对象才能运行,那么它们应该被传递给构造函数而不是其他任何方法。无论如何,我是依赖注入的忠实粉丝,但是这种方法还允许通过传入模拟对象等来进行更好的单元测试。

答案 2 :(得分:2)

你可以将参数合并到一个Parameter Object中,然后传递它。

答案 3 :(得分:0)

如果你在XAML中使用这个类,你可以使所有8个属性都可以单独设置,如果有人试图在没有设置它们的情况下执行一个方法,则抛出异常。您可能希望在调用方法后“冻结”对象,如果有人试图在“冻结”对象上设置属性,则抛出异常。

但是,我不打算判断哪种方法更好。

答案 4 :(得分:0)

构造函数是在编译时执行此操作的唯一方法。如果没有设置所有参数,则另一种选择是抛出异常。

答案 5 :(得分:0)

给他们默认值? 也许您可以提供更多的背景信息,让我们帮助您!

答案 6 :(得分:0)

如果您使用的是c#3.0,则可以使用对象初始值设定项。无论是否“更好”,这都是随意的。

答案 7 :(得分:0)

在属性中使用setter。当方法使用属性且尚未设置属性时,setter会为您执行此操作。这不是推荐的方法,但在某些情况下可能需要。

类似的东西会起作用

    Class SomeClass        
    {
     string name;
     string Name 
     { 
       set 
       {
        if (name  == null) 
         name  = value; 
       }
     }
   }

答案 8 :(得分:0)

构造函数听起来是执行此操作的最佳方式,因为它将在编译磁贴上进行验证。当然,您可以拥有部分或全部属性的默认值,然后是链构造函数,这样就不需要在构造函数中设置每个属性。类似的东西:

public class Person
{
    public string Name { get; set; }
    public double Height { get; set; }
    public DateTime DoB { get; set; }


    public Person(string name, double height, DateTime dob) : this(name, height)
    {
        this.DoB = dob;
    }

    public Person(string name, double height)
    {
        this.Name = name;
        this.Height = height;
        this.DoB = DateTime.Now.Date;
    }
}

这意味着您可以使用两个或三个参数构造一个新的Person对象,但所有参数都将被设置(但如果您使用两个,那么DOB将获得今天的默认值):

Person person1 = new Person("Geoff", 1.8, new DateTime(1950, 5, 12));
Person person2 = new Person("John", 1.54); // Gets default DOB