C# 如何为整个项目锁定对象?

C# 如何为整个项目锁定对象?,c#,private,readonly,encapsulation,C#,Private,Readonly,Encapsulation,我有一个非常复杂的对象(许多不同的属性,也有包含相同类对象的对象,还向后引用父对象)作为静态类中的全局对象,它由静态构造函数初始化了一次,我希望它保持这种状态,之后再也不会更改。在我的代码中,这个对象在不同的地方被多次使用,但有时会用它制作一个克隆,注意不要更改其原始引用(以及属性、子属性等)中的任何内容。然而,我想我在某个地方犯了一个错误,我删除了它的一些子属性。我可以通过一步一步地调试找到错误所在,但这将花费我很多时间是否有一种方法可以锁定整个对象(不仅仅是引用,还有整个对象及其所有属性,无

我有一个非常复杂的对象(许多不同的属性,也有包含相同类对象的对象,还向后引用父对象)作为静态类中的全局对象,它由静态构造函数初始化了一次,我希望它保持这种状态,之后再也不会更改。在我的代码中,这个对象在不同的地方被多次使用,但有时会用它制作一个克隆,注意不要更改其原始引用(以及属性、子属性等)中的任何内容。然而,我想我在某个地方犯了一个错误,我删除了它的一些子属性。我可以通过一步一步地调试找到错误所在,但这将花费我很多时间是否有一种方法可以锁定整个对象(不仅仅是引用,还有整个对象及其所有属性,无论它们有多深),使其在第一次初始化后不再被更改

我尝试查看
readonly
修饰符,但我想它不适合我,因为它只约束对象的引用,而不约束对象下的所有内容

同样的原因,
private
也不适合我


有更好的方法吗?

听起来你想要一个单身汉

在包含此对象的类中生成函数:

function getComplexObject() // is m_object NULL? // instantiate object. // return m_object. 函数getComplexObject() //m_对象是否为空? //实例化对象。 //返回m_对象。 并使m_对象成为类的属性

然后始终使用此函数获取对象。这样,您可以确保它只创建一次

有没有办法把整个东西锁起来

无法防止可变对象(或对象图)的突变。换言之:如果可以修改对象(例如,如果它有一个非只读的公共字段,或者如果它有一个具有setter的属性),则无法阻止对其进行修改

我试着看只读修饰符,但我想它不适合我 因为它只约束对象的引用,而不约束 所有在它下面的东西

对。当字段声明包含只读修饰符时,对该声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中发生。(来源:)


但是,您可以将类型设计为现有类型,或者至少不能通过公共字段、属性或方法对其进行修改


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

如果您想要一个不可变的对象图,则必须定义一组实际上不可变的类。你不能只是将不可变性强加给一组现有的类。返回克隆可能会减慢速度,因为我经常使用对象,但我将尝试使它的每个属性都不可变。这将导致许多错误,因为我对封装不够严格,所以我最终将被迫改进代码。谢谢,回答得很好@StefanosKargas:最好花点时间在代码中找到修改对象的位置。这是一个真正的错误。无论如何,你都得把它修好。使用诸如ReSharper之类的工具来查找用法。