C# 如何保持字段只读?
假设我们有以下类:C# 如何保持字段只读?,c#,initialization,member,readonly,C#,Initialization,Member,Readonly,假设我们有以下类: class C { private readonly DataType data; private readonly AdditionalType additional; C(DataType newData) { data = newData; // LONG code evaluating additional } C(OtherType newData) { //
class C
{
private readonly DataType data;
private readonly AdditionalType additional;
C(DataType newData)
{
data = newData;
// LONG code evaluating additional
}
C(OtherType newData)
{
// eval data from newData
// the same LONG code evaluating additional
}
}
在C的整个生命周期中,数据
和附加
都保持不变。但是,有一种代码气味:两个构造器中评估附加
的部分都加倍了。自然选择是将其提取到另一种方法:
class C
{
private readonly DataType data;
private readonly AdditionalType additional;
private void EvalAdditional()
{
// LONG code evaluating additional
}
C(DataType newData)
{
data = newData;
EvalAdditional();
}
C(OtherType newData)
{
// eval data from newData
EvalAdditional();
}
}
但是附加的不再是只读的(因为它不是在ctor中初始化的)
如何优雅地解决此问题?只需让方法
evaladeditional
返回附加的对象(而不是void
)
只需让方法evaladeditional
返回additional
对象(而不是void
)
如果additional
的计算不依赖于提供给其他构造函数的参数,则可以将其移动到私有构造函数,并从公共构造函数调用该构造函数:
private C()
{
//long code evaluating additional
}
C(DataType newData)
: this()
{
data = newData;
}
如果additional
的计算不依赖于提供给其他构造函数的参数,则可以将其移动到私有构造函数,并从公共构造函数调用该构造函数:
private C()
{
//long code evaluating additional
}
C(DataType newData)
: this()
{
data = newData;
}
你可以这样做:
C(DataType newData)
:this ()
{
data = newData;
}
C(OtherType newData)
:this ()
{
// eval data from newData
}
private C()
{
EvalAdditional();
}
尽管这在很大程度上取决于EvalAdditional的操作,但如果需要,您可以传递参数。您可以执行以下操作:
C(DataType newData)
:this ()
{
data = newData;
}
C(OtherType newData)
:this ()
{
// eval data from newData
}
private C()
{
EvalAdditional();
}
尽管这在很大程度上取决于EvalAdditional所做的工作,但如果需要,您可以传递参数。对附加
的求值是否取决于构造函数参数?如果没有,您可以将求值移动到另一个私有构造函数,并从公共构造函数调用它..../LONG code。。。对构造函数中的任何内容求值本身就是一种代码味道。来自MSDN:构造函数除了捕获构造函数参数外,不应该做太多工作。任何其他处理的成本都应延迟到需要时。附加的的计算是否取决于构造函数参数?如果没有,您可以将求值移动到另一个私有构造函数,并从公共构造函数调用它..../LONG code。。。对构造函数中的任何内容求值本身就是一种代码味道。来自MSDN:构造函数除了捕获构造函数参数外,不应该做太多工作。任何其他处理的成本应延迟到需要时。问题是如何保持附加
字段只读
。问题是如何保持附加
字段只读
。