1

我有类,创建对象时必须在其中的所有字段。我的解决方案:

class MyClass
{
    private string Field1;
    private int Field2;

    public MyClass(string Field1, int Field2)
    {
        this.Field1 = Field1;
        this.Field2 = Field2;
    }
}

但是字段可能大于2,代码看起来很脏。有没有更优雅的方法?

4

6 回答 6

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
    }
}
于 2013-09-04T19:59:26.277 回答
2

可以使用 System.ComponentModel.DataAnnotations.RequiredAttribute

[Required]
public string Field1{ get; set; }
于 2013-09-04T20:04:17.897 回答
2

您可以使用带有 setter 而不是字段的属性,然后使用 IsValid() 方法检查对象在使用之前是否已完全“填充”。但是,如果您要在代码中同时设置所有值,那看起来不会更整洁。

使用长的构造函数参数列表,命名参数可以帮助调用更具可读性。

于 2013-09-04T20:05:18.510 回答
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;
}
于 2013-09-04T20:00:54.383 回答
1

您可以拥有这样的东西,然后在您尝试访问其中的字段时引用该对象。

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
}
于 2013-09-04T20:05:37.623 回答
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 对象。

于 2013-09-04T20:10:07.673 回答