我有类,创建对象时必须在其中的所有字段。我的解决方案:
class MyClass
{
private string Field1;
private int Field2;
public MyClass(string Field1, int Field2)
{
this.Field1 = Field1;
this.Field2 = Field2;
}
}
但是字段可能大于2,代码看起来很脏。有没有更优雅的方法?
我有类,创建对象时必须在其中的所有字段。我的解决方案:
class MyClass
{
private string Field1;
private int Field2;
public MyClass(string Field1, int Field2)
{
this.Field1 = Field1;
this.Field2 = Field2;
}
}
但是字段可能大于2,代码看起来很脏。有没有更优雅的方法?
将所需的字段传递给构造函数应该没问题。您的代码看起来还不算脏,但是如果它开始增长说 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
}
}
可以使用 System.ComponentModel.DataAnnotations.RequiredAttribute
[Required]
public string Field1{ get; set; }
您可以使用带有 setter 而不是字段的属性,然后使用 IsValid() 方法检查对象在使用之前是否已完全“填充”。但是,如果您要在代码中同时设置所有值,那看起来不会更整洁。
使用长的构造函数参数列表,命名参数可以帮助调用更具可读性。
实际上没有其他方法可以确保用户为每个字段提供一个值,但您可以自己提供一个默认值。
例如,您可以提供一个替代构造函数,该构造函数构造一个具有某些默认字段值的对象,如下所示:
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;
}
您可以拥有这样的东西,然后在您尝试访问其中的字段时引用该对象。
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
}
我认为您需要私有构造函数、工厂方法和命名参数,例如:
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 对象。