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