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

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

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

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

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

编辑:为避免重复检查,您可以将readonlyfunction封装在类中。

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

class ReadOnlyField { 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 FakeReadOnly = new ReadOnlyField(); // 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; 

最后一个语句将抛出exception。

请尝试以下方法:

 class MyClass{ private int num1; public int Num1 { get { return num1; } } public MyClass() { num1=10; } } 

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

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

或使用自动财产:

 public TYPE Field { get; private set; }