是否可以使函数返回的对象在C#中不可变?

是否可以使函数返回的对象在C#中不可变?,c#,object,immutability,C#,Object,Immutability,我正在编写一个函数,返回对某个封装数据结构的对象的引用,我希望没有人能够使用该引用更改对象,是否可以在c#中执行此操作?我看到的唯一方法是为这种类型创建两个接口。一个接口只是只读的。然后,该方法只返回此只读接口的一个实例。如果要返回的对象是不可变的,则可以正常工作 如果没有,您可以返回一个只公开只读属性的包装器对象。我认为没有任何内置方法。C++对C++的正确性似乎没有同样的支持。您可以将内部成员设置为只读,这将是一个开始。但事情远不止这些 您将使类的所有成员函数都成为非mutator函数,并使

我正在编写一个函数,返回对某个封装数据结构的对象的引用,我希望没有人能够使用该引用更改对象,是否可以在c#中执行此操作?

我看到的唯一方法是为这种类型创建两个接口。一个接口只是只读的。然后,该方法只返回此只读接口的一个实例。

如果要返回的对象是不可变的,则可以正常工作


如果没有,您可以返回一个只公开只读属性的包装器对象。

我认为没有任何内置方法。C++对C++的正确性似乎没有同样的支持。您可以将内部成员设置为只读,这将是一个开始。但事情远不止这些

您将使类的所有成员函数都成为非mutator函数,并使所有数据成员属性都带有私有setter。在实现属性的getter时,复制返回的任何类,并返回一个新实例,而不是返回对私有成员的引用

class SomeClass
{
    public void SomeFunctionThatDoesNotModifyState()
    {
    }

    public int SomeProperty
    {
        get
        {
            return someMember; // This is by-value, so no worries
        }
    }

    public SomeOtherClass SomeOtherProperty
    {
        get
        {
            return new SomeOtherClass(someOtherMember);
        }
    }
}
给别人上课 { // .... }

在调用复制构造函数时,您必须非常小心,确保其他类的实现执行深度复制


即便如此,你也不能100%保证有人不会修改你的对象,因为用户可以通过反射侵入任何对象。

而且调用者可以转换到非只读的界面。但没有人会这样做。:-)包装更安全。所以我也喜欢你的版本。@Oded,或者使用反射来阅读私人成员。IMHO.Net既没有正确的不变性,也没有完全的可访问性管理。@Dykam,可访问性应该是帮助你的,而不是保护你。它可以使编写代码变得更容易,但不解决任何实际的安全问题。如果反射不能修改私有变量,那么你会有很多次诅咒.NET的设计者,因为他们认为他们比他们的用户知道得多。@tster,我知道原因,但我遇到过一些情况,我诅咒.NET没有可靠的安全性。要完全保存,您需要启动并完全分离AppDomain。一、 就个人而言,希望一些属性将成员标记为不可反射/不可反射。+1唯一的问题是,它们是否已经在某个地方引用了不可变类型的内部结构。