我有以下课程:
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; }
在创建新实例时,是否有一种简单的方法可以使Status的值始终默认为“3”?大多数人使用的方式是什么?
更新
我添加了一个setter但是如果调用另一个构造函数则不会设置。
答案 0 :(得分: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; }
}
<强>更新强>
在您更新问题后,您还可以查看this answer以重新排列构造函数。
答案 1 :(得分:3)
protected AuditableTable() { // no need to use : base(), it is called implicitly
Status = 3;
}
答案 2 :(得分:3)
不要使用自动实现的属性。声明具有初始值的私有字段。
private int _status=3;
public int Status
{
get { return _status;}
set {_status=value;}
}
编辑:在构造函数中分配属性值是good practice但是如果该类有多个构造函数,我认为在声明时初始化成员会很好。
答案 3 :(得分:1)
这通常通过链接构造函数来完成。你可以通过一个通用的构造函数调用每个构造函数。例如:
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.
}