如何锁定整个项目的对象?

时间:2013-12-28 14:31:12

标签: c# private readonly encapsulation

我有一个非常复杂的对象(许多不同的属性以及其中包含相同类对象的对象,并且还向后引用父对象)作为静态类中的全局,由一个静态类初始化一段时间的静态构造函数和 我希望它保持这样,并且在那之后永远不会改变 。这个对象在我的代码中在不同的地方被多次使用,而有时克隆是由它做出的,小心不要改变其原始引用中的任何内容(以及属性,子属性等)。但是,我想我在某个地方犯了一个错误,我删除了一些子属性。我可以通过一步一步的调试找到错误的位置,但这会花费我很多时间。 是否有办法锁定整个事物(不仅仅是引用,而是整个对象及其所有属性,无论它们有多深)在第一次初始化之后不再被修改时间?

我试着查看readonly修饰符,但我猜它不适合我,因为它只限制了对象的引用而不是它下面的所有内容。

同样private也不适合我。

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

  

有没有办法锁定整个事情

无法防止可变对象(或对象图)的变异。换句话说:如果可以修改对象(例如,如果它有一个不是只读的公共字段,或者它有一个具有setter的属性),则无法阻止它被修改。

  

我试着查看readonly修饰符,但我想它不适合我   因为它只约束对象的引用而不是   一切都在它之下。

正确。当字段声明包含只读修饰符时,声明引入的字段的赋值只能作为声明的一部分或在同一个类的构造函数中出现。 (来源:msdn


但是,您可以设计类型,使其为immutable或至少不能通过公共字段,属性或方法进行修改。

您可能还会考虑返回对象图的克隆而不是原始对象图。如果克隆被修改,原始对象图仍然是未修改的。

答案 1 :(得分:-2)

听起来你想要一个单身人士?

在包含此对象的类中构建函数:

function getComplexObject()

  // is m_object NULL? 

    // instantiate object. 

  // return m_object. 

使m_object成为类的属性。

然后总是使用此函数来获取对象。这样你就可以确定它只会被创建一次。