我在一个框架中工作,迫使我使用默认构造函数创建一个类的实例,所以我很遗憾不能使用'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 }
}
答案 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 。