Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何保持字段只读?_C#_Initialization_Member_Readonly - Fatal编程技术网

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:构造函数除了捕获构造函数参数外,不应该做太多工作。任何其他处理的成本应延迟到需要时。问题是如何保持
附加
字段
只读
。问题是如何保持
附加
字段
只读