我有一个类,所有的字段都必须在创建对象时。我的解决方案:
class MyClass
{
private string Field1;
private int Field2;
public MyClass(string Field1, int Field2)
{
this.Field1 = Field1;
this.Field2 = Field2;
}
}
但是字段可能大于2,代码看起来很脏。有更优雅的方法吗?
答案 0 :(得分:3)
传递构造函数所需的字段应该没问题。您的代码看起来并不脏,但如果它开始增长需要10个必填字段,那么最好创建一个包含所有必需字段的对象,然后在创建对象时使用该对象(构造函数)。
现在这不脏“
class MyClass
{
private string Field1;
private int Field2;
public MyClass(string Field1, int Field2)
{
this.Field1 = Field1;
this.Field2 = Field2;
}
}
如果它变成这样
class MyClass
{
private string Field1;
private int Field2;
public MyClass(string Field1, int Field2, int Field3, int Field4, int Field5, int Field6, int Field7, int Field8, int Field9, int Field10)
{
this.Field1 = Field1;
this.Field2 = Field2;
//Set them
}
}
然后最好有这个
class RequiredFields
{
//All required fields
}
class MyClass
{
private string Field1;
private int Field2;
public MyClass(RequiredFields requiredFields)
{
this.Field1 = requiredFields.Field1;
this.Field2 = requiredFields.Field2;
//Set them
}
}
答案 1 :(得分:2)
您可以使用带有setter而不是field的属性,然后使用IsValid()方法检查对象在使用之前是否已“完全填充”。但是,如果您要在代码中同时设置所有值,那么这看起来不会更整洁。
使用长构造函数参数列表,Named Arguments可以帮助调用更具可读性。
答案 2 :(得分:1)
确实没有其他方法可以确保用户为每个字段提供值,但您可以自己提供默认值。
例如,您可以提供一个替代构造函数,用于构造具有某些默认字段值的对象,如下所示:
public MyClass() : this(string.Empty, -1)
{
}
public MyClass(string Field1, int Field2)
{
this.Field1 = Field1;
this.Field2 = Field2;
}
或者:
public MyClass(string Field1 = "", int Field2 = -1)
{
this.Field1 = Field1;
this.Field2 = Field2;
}
答案 3 :(得分:1)
可以使用System.ComponentModel.DataAnnotations.RequiredAttribute
[Required]
public string Field1{ get; set; }
答案 4 :(得分:1)
你可能只有这样的东西,然后在你试图访问其中的字段时引用Object。
class MyClass
{
private MyObject Test;
public MyClass(MyObject Test)
{
this.Test = Test;
}
}
class MyObject
{
private string Field1;
private int Field2;
// Constructor / methods to set up fields
}
答案 5 :(得分:1)
我认为您需要私有构造函数,工厂方法和命名参数,例如:
class MyClass
{
private string Field1;
private int Field2;
private MyClass()
{
}
public MyClass GetMyClassInstance(string Field1=string.Empty, int Field2=-1)
{
this.Field1 = Field1;
this.Field2 = Field2;
}
}
现在您可以添加任何参数计数来创建MyClass的对象。