仅在事后才读取类字段

时间:2013-04-30 05:46:32

标签: c# readonly

我在一个框架中工作,迫使我使用默认构造函数创建一个类的实例,所以我很遗憾不能使用'readonly`并将参数传入该字段。

在我创建实例后,我计划通过公共属性设置字段,除非有更合适的方法。

是否可以强制此字段在设置后才能读取?没有在属性集中使用bool或一些计数器逻辑?

使用某些伪代码进行更新

public class SomeClass
{
    public Create()
    {
        object = Framework.CreateClass<NeedArgument>();
        object.mustSet = value;
    }
}

public class NeedArgument : FrameworkBase
{
    public mustSet;
    public NeedArgument(){}
    public NeedArgument(value) { mustSet = value }

}

4 个答案:

答案 0 :(得分:5)

不,没有什么可以轻易做到的。

您可能考虑使用构建器模式的一个选项:使用一个方法将一个可变类型转换为一个不可变类型的实例...当然,它可以有只读字段。如果您使用的框架要求“最终”类型是它开始构建的类型,那么这可能不起作用。

C#的对象初始化器语法使这非常令人愉快。例如,在Noda Time中,您可以写:

Period period = new PeriodBuilder { Days = 1, Hours = 22 }.Build();

如果你无法更改类型,那么你需要实现某种"popsicle immutability" or "write-once immutability",这两种都是繁琐而烦人的。

答案 1 :(得分:1)

  

不使用属性集中的bool或一些计数器逻辑

不,这是不可能的。您应该为字段添加一些初始化逻辑。

答案 2 :(得分:1)

将类继承到需要construtors并为其赋值的类中,属性覆盖是一个选项。

答案 3 :(得分:1)

使用两个支持字段组成字段:一个是正常的,另一个是bool HasBeenSet = false;。如果HasBeenSet为false,则仅允许一个集合,然后在设置值后设置它。

这可能会推广到泛型类monad,但是现在尝试编写示例代码为时已晚。 monad的全部动机毕竟是围绕现有类型包含其他信息。它将是只读的monad(或者也许是已读取的monad