开发者

Is it possible to make objects returned by a function immutable in C#?

开发者 https://www.devze.com 2023-01-10 21:32 出处:网络
I am writing a function that returns a reference to an object of some encapsulated data structure and I want nobody to be able to change the object using that reference, is it possibl开发者_运维百科e

I am writing a function that returns a reference to an object of some encapsulated data structure and I want nobody to be able to change the object using that reference, is it possibl开发者_运维百科e to do this in c#?


If the object that you are returning is immutable, that will work fine.

If not, you can return a wrapper object that only exposes read-only properties.


The only way I see is to create two interfaces for this type. One interface just being read only. Then the method just returns an instance of this readonly interface.


I don't think there is any built-in way. C# doesn't seem to have the same support for const-correctness that C++ does. You can make the internal members read-only, and that will be a start. But there is more to it than that.

You would make all member functions of your class non-mutator functions, and make all data members properties w/ private setters. When implementing the getters for the properties, copy any classes that come back, and return a new instance, rather than returning a reference to a private member.

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);
        }
    }
}

class SomeOtherClass { // .... }

You will have to be very careful that the implementation of SomeOtherClass does a deep copy when you call the copy constructor.

Even after all this, you can't 100% guarantee that someone won't modify your object, because the user can hack into any object via reflections.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号