是否有可能只分配一次的字段?

Afs*_*bbi 6 c# readonly

我需要一个可以从我想要的地方分配的字段,但是应该可以只分配一次(因此应该忽略后续的分配).我怎样才能做到这一点?

Bri*_*sen 17

那不会是一个只读字段.初始化实际只读字段的唯一选项是字段初始化程序和构造函数.

但是,您可以使用属性实现一种只读功能.将您的字段设为属性.实现一个"冻结实例"方法,该方法翻转一个标志,表明不再允许对只读部分进行更新.让你的二传手检查这个标志.

请记住,您放弃了运行时检查的编译时检查.编译器会告诉您是否尝试从声明/构造函数的任何位置为只读字段赋值.使用下面的代码,您将获得异常(或者您可以忽略更新 - 这两者都不是最佳IMO).

编辑:为避免重复检查,您可以将readonly功能封装在类中.

修订后的实现可能如下所示:

class ReadOnlyField<T> {
    public T Value {
        get { return _Value; }
        set { 
            if (Frozen) throw new InvalidOperationException();
            _Value = value;
        }
    }
    private T _Value;

    private bool Frozen;

    public void Freeze() {
        Frozen = true;
    }
}


class Foo {
    public readonly ReadOnlyField<int> FakeReadOnly = new ReadOnlyField<int>();

    // forward to allow freeze of multiple fields
    public void Freeze() {
        FakeReadOnly.Freeze();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你的代码可以做类似的事情

        var f = new Foo();

        f.FakeReadOnly.Value = 42;

        f.Freeze();

        f.FakeReadOnly.Value = 1337;
Run Code Online (Sandbox Code Playgroud)

最后一个语句将抛出异常.

  • @afsharm - 如果不值得为每个字段添加5行,那么你显然不需要这个功能(不知道为什么你会这样做). (2认同)