C# 是否可以只分配一次字段?

C# 是否可以只分配一次字段?,c#,readonly,C#,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();
    }
}

最后一条语句将引发异常

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

private TYPE field;

public TYPE Field
{
   get { return field; }
   private set { field = value; }
}
或使用自动属性:

public TYPE Field { get; private set; }
请尝试以下操作:

class MyClass{
private int num1;

public int Num1
{
   get { return num1; }

}


public MyClass()
{
num1=10;
}

}

我目前正在使用这样一个“冻结实例”解决方案,但我的类有这么多字段,为每个字段添加5行是没有意义的。但是“字段初始值设定项”呢?我不知道是什么。是否可以指定只读字段?这与“属性”相同吗?这里没有字段初始值设定项对您没有帮助。如果你不需要为每一个字段添加5行,那么显然你不需要这个功能(也不知道为什么你会这么做)。请考虑问题本身和所有答案的评论。如果你可以把它分配到你想要的任何地方,它几乎不是只读的,是吗?你到底想要什么?这很可能是我很久以来见过的最奇怪的要求之一。为什么需要一个非只读的只读字段?我需要一个仅在第一次分配的只读字段。我想要的是非常像C#中的只读字段,但我希望它的第一个赋值可以在构造函数之外的其他地方进行。我想用它来跟踪数据的变化。@afsharm:我冒昧地编辑了你的问题,来描述更多我认为你真正想要的东西。我希望我做对了;否则,只需根据您的喜好进行编辑。这可能就是您想要的:不!我不是这个意思!事实上,我有一个对象,它由数据库中的NHibernate填充,然后传递给UI。用户可以编辑或不编辑某些字段,但我不允许在某些特定字段中进行更改。我认为我可以实现的方法之一是为每个字段定义一个只读的阴影字段,然后将此阴影字段与原始字段进行比较,并了解是否发生了更改。请考虑在构造函数中没有填充这些字段。这样做不是更好吗?这样用户只能编辑其中的一些,只在标签中而不是文本框中显示只读字段,或是这样的?如果您使用的是属性网格,您可以将[ReadOnly]属性粘贴在其上方。这是SOA应用程序。我们在web、winform和console中都有UI,我不允许在服务之外的任何地方这样做。
class MyClass{
private int num1;

public int Num1
{
   get { return num1; }

}


public MyClass()
{
num1=10;
}

}