2

我正在一个框架中工作,该框架迫使我使用默认构造函数创建一个类的实例,所以很遗憾我不能使用“只读”并将参数传递给该字段。

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

是否可以强制该字段仅在设置后才被读取?不在属性集中使用布尔值或某些计数器逻辑?

用一些伪代码更新

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

4 回答 4

5

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

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

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

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

如果你不能改变类型,那么你需要实现某种“popsicle immutability”或“write-once immutability”,这两者都是繁琐和烦人的。

于 2013-04-30T05:52:07.823 回答
1

用两个支持字段组成字段:一个正常,另一个是bool HasBeenSet = false;。仅当 HasBeenSet 为 false 时才允许设置,然后在设置值后设置它。

这可能可以推广到泛型类型的 monad,但是现在尝试为此编写示例代码为时已晚。毕竟,monad 的全部动机是围绕现有类型包装附加信息。这将是只读 monad(或者可能是late-read-only monad

于 2013-04-30T05:59:32.497 回答
1

在属性集中不使用布尔值或某些计数器逻辑

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

于 2013-04-30T05:51:12.100 回答
1

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

于 2013-04-30T05:51:21.237 回答