带有必填字段的C#类

时间:2013-09-04 19:56:24

标签: c# constructor field params

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

class MyClass
{
    private string Field1;
    private int Field2;

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

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

6 个答案:

答案 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的对象。