我有两个构造函数,它们将值提供给只读字段。
public class Sample
{
public Sample(string theIntAsString)
{
int i = int.Parse(theIntAsString);
_intField = i;
}
public Sample(int theInt) => _intField = theInt;
public int IntProperty => _intField;
private readonly int _intField;
}
一个构造函数直接接收值,另一个构造函数进行一些计算并获得值,然后设置字段。
现在问题来了:
我不想复制
设置代码。在这种情况下,只有一个
场地已经设置好了,当然还有可能
要大于1。
要使字段为只读,我需要
从构造函数中设置它们,那么
我不能将共享代码“提取”到
效用函数。
我不知道怎么叫
另一个构造函数。
什么好主意吗?
如果没有初始化方法就不能令人满意地实现你想要的(例如,因为你想在初始化代码之前做太多事情,或者将它包装在try-finally中,或者其他什么),你可以让任何或所有构造函数通过引用初始化例程来传递只读变量,然后该例程将能够随意操作它们。
public class Sample
{
private readonly int _intField;
public int IntProperty => _intField;
private void setupStuff(ref int intField, int newValue) => intField = newValue;
public Sample(string theIntAsString)
{
int i = int.Parse(theIntAsString);
setupStuff(ref _intField,i);
}
public Sample(int theInt) => setupStuff(ref _intField, theInt);
}
在我的例子中,我有一个主构造函数,它使用OracleDataReader作为参数,但我想使用不同的查询来创建实例:
我有这样的代码:
public Subscriber(OracleDataReader contractReader)
{
this.contract = Convert.ToString(contractReader["contract"]);
this.customerGroup = Convert.ToString(contractReader["customerGroup"]);
this.subGroup = Convert.ToString(contractReader["customerSubGroup"]);
this.pricingPlan= Convert.ToString(contractReader["pricingPlan"]);
this.items = new Dictionary<string, Member>();
this.status = 0;
}
所以我创建了以下构造函数:
public Subscriber(string contract, string customerGroup) : this(getSubReader(contract, customerGroup))
{ }
这个方法是:
private static OracleDataReader getSubReader(string contract, string customerGroup)
{
cmdSubscriber.Parameters[":contract"].Value = contract + "%";
cmdSubscriber.Parameters[":customerGroup"].Value = customerGroup+ "%";
return cmdSubscriber.ExecuteReader();
}
注意:静态定义的cmdSubscriber在代码的其他地方定义;在这个示例中,我的主构造函数进行了简化。