[英]How can I make the value of a field default to something when a class is constructed?
我有以下课程:
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,但是如果调用其他构造函数,则不会设置。
您可以在构造函数中执行此操作。 这就是它们的用途。
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; }
}
更新:
更新问题后,您还可以查看此答案以重新排列构造函数。
protected AuditableTable() { // no need to use : base(), it is called implicitly
Status = 3;
}
不要使用自动实现的属性。 声明一个具有初始值的私有字段。
private int _status=3;
public int Status
{
get { return _status;}
set {_status=value;}
}
编辑:在构造函数中分配属性值是一种很好的做法,但是如果该类具有多个构造函数,则比我认为在声明时初始化成员更好。
这通常是通过链接构造函数来完成的。 您可以通过一个通用的构造函数将每个构造函数调用为“ 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
,因为readonly
字段只能在构造函数中进行修改,而不能在构造函数调用的方法中进行修改。
建议使用具有显式后备字段的属性而不是使用自动实现的属性来删除答案。 尽管存在负面评论,但这是完全有效且相当合理的事情。 当然,它不像自动实现的属性那么漂亮,但是它非常有效。 这是我们在拥有自动实现的属性之前所做的,并且如果您确实需要属性的默认值,也没有理由不这样做。 如果您看不到已删除的答案:
public class MyThing : MyBaseThing
{
private string _status = "3";
public string Status
{
get { return _status; }
set { _status = value; }
}
// constructors go here.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.