如何在构造类时使字段的值默认为某些值

本文关键字:默认 字段 | 更新日期: 2023-09-27 18:19:00

我有以下类:

 public abstract class AuditableTable : TableServiceEntity, IAuditableTable  
    {
    protected AuditableTable()
        : base()
    {
        Status = "3";
    }
    protected AuditableTable(string pk, string rk)
        : base(pk, rk) 
    { 
    }
    public string Status { get; set; }

是否有一个简单的方法,我可以使状态的值总是默认为"3",当一个新的实例被创建?大多数人使用的是什么方式?

我添加了一个setter,但是如果调用另一个构造函数,它将不会设置

如何在构造类时使字段的值默认为某些值

不要使用自动实现的属性。声明一个具有初始值的私有字段

private int _status=3;
public int Status
{
  get { return _status;}
  set {_status=value;}
}

编辑:在构造函数中分配属性值是很好的做法,但如果该类有多个构造函数,我认为在声明时初始化成员会很好。

protected AuditableTable() { // no need to use : base(), it is called implicitly
    Status = 3;
}

您可以在构造函数中这样做。这就是它们的用处。

public abstract class AuditableTable : TableServiceEntity, IAuditableTable  
{
    protected AuditableTable()
        : base()
    {
        InitFields();
    }
    protected AuditableTable(string pk, string rk)
        : base(pk, rk) 
    { 
        InitFields();
    }
    private InitFields()
    {
        Status = "3";
    }
    public string Status { get; set; }
}

更新:

当你更新了问题,你也可以看看这个答案来重新安排你的构造函数

这通常是通过链接构造函数完成的。每个构造函数都通过一个公共构造函数调用"up"。例如:

public class MyThing : MyBaseThing
{
    public MyThing()
        : this(null, null)
    {
    }
    public MyThing(string pk, string rk)
        : base(pk, rk)
    {
        Status = "3";
    }
    public string Status { get; set; }
}
如果可以链接构造函数,

效果会很好。但有时你会有不能链接的构造函数。如果是这种情况,那么请确保每个"叶子"构造函数调用某种类型的私有Init()方法,该方法执行公共初始化。当你有一个readonly字段时,这有时是一件令人头疼的事情,因为readonly字段只能在构造函数中修改——而不能在构造函数调用的方法中修改。

已删除的回答建议使用带有显式支持字段的属性,而不是使用自动实现的属性。这是一件完全合理的事情,尽管有负面评论。当然,它不像自动实现的属性那么漂亮,但它非常有效。这是我们在拥有自动实现属性之前所做的,如果你真的需要一个属性的默认值,没有理由不这样做。如果您看不到已删除的答案:

public class MyThing : MyBaseThing
{
    private string _status = "3";
    public string Status
    {
        get { return _status; }
        set { _status = value; }
    }
    // constructors go here.
}