我需要一个可以从我想要的地方分配的字段,但是应该可以只分配一次(因此应该忽略后续的分配)。我怎么能这样做?
答案 0 :(得分: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();
}
}
然后您的代码可以执行类似
的操作 var f = new Foo();
f.FakeReadOnly.Value = 42;
f.Freeze();
f.FakeReadOnly.Value = 1337;
最后一个语句会抛出异常。
答案 1 :(得分:1)
尝试以下方法:
class MyClass{
private int num1;
public int Num1
{
get { return num1; }
}
public MyClass()
{
num1=10;
}
}
答案 2 :(得分:0)
或许你的意思是每个人都可以阅读的字段,但只有类本身可以写入?在这种情况下,请使用带有公共getter和私有setter的私有字段。
private TYPE field;
public TYPE Field
{
get { return field; }
private set { field = value; }
}
或使用自动属性:
public TYPE Field { get; private set; }