具有必填字段的 C# 类

本文关键字:字段 | 更新日期: 2023-09-27 18:30:23

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

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

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

具有必填字段的 C# 类

将所需的字段传递给构造函数应该没问题。您的代码看起来还不脏,但如果它开始增长到 10 个必填字段,那么最好创建一个包含所有必填字段的对象,然后在创建对象时使用该对象 (Constructor)。

现在这不脏

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;
}

你可以有这样的东西,然后在你尝试访问其中的字段时引用 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
}

我认为您需要私有构造器,工厂方法和命名参数,例如:

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