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

时间:2010-08-08 11:07:35

标签: c# object immutability

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

3 个答案:

答案 0 :(得分:8)

如果您要返回的对象是不可变的,那么它将正常工作。

如果没有,则可以返回仅显示只读属性的包装器对象。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我认为没有任何内置方式。 C#似乎对C ++的const-correctness没有相同的支持。您可以将内部成员设为只读,这将是一个开始。但是还有更多的东西。

您将使您的类非变异函数的所有成员函数,并使所有数据成员属性与私有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);
        }
    }
}

类SomeOtherClass {     // .... }

当您调用复制构造函数时,您必须非常小心,SomeOtherClass的实现会执行深层复制。

即使在所有这些之后,你也不能100%保证有人不会修改你的对象,因为用户可以通过反射攻击任何对象。