Ristovak
Ristovak

Reputation: 481

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

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 possible to do this in c#?

Upvotes: 6

Views: 450

Answers (3)

Merlyn Morgan-Graham
Merlyn Morgan-Graham

Reputation: 59151

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.

Upvotes: 1

Oded
Oded

Reputation: 499382

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.

Upvotes: 8

schoetbi
schoetbi

Reputation: 12906

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.

Upvotes: 1

Related Questions