6

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

4

3 回答 3

17

那将不是一个只读字段。初始化真正的只读字段的唯一选择是字段初始化器和构造器。

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

请记住,您正在放弃编译时检查以进行运行时检查。如果您尝试从除声明/构造函数之外的任何地方为只读字段分配值,编译器会告诉您。使用下面的代码,您将得到一个异常(或者您可以忽略更新 - 这两者都不是最佳 IMO)。

编辑:为避免重复检查,您可以将只读功能封装在一个类中。

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

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();
    }
}

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

        var f = new Foo();

        f.FakeReadOnly.Value = 42;

        f.Freeze();

        f.FakeReadOnly.Value = 1337;

最后一条语句将引发异常。

于 2009-10-20T07:14:59.803 回答
1

尝试以下操作:

class MyClass{
private int num1;

public int Num1
{
   get { return num1; }

}


public MyClass()
{
num1=10;
}

}
于 2009-10-20T07:58:23.037 回答
0

或者,也许您的意思是每个人都可以阅读但只有类本身可以写入的字段?在这种情况下,请使用带有公共 getter 和私有 setter 的私有字段。

private TYPE field;

public TYPE Field
{
   get { return field; }
   private set { field = value; }
}

或使用自动属性:

public TYPE Field { get; private set; }
于 2009-10-20T07:24:43.163 回答