Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Immutable vs Mutable C#

Tags:

c#

oop

I am trying to write a quick snippet to demonstrate the difference between an immutable and mutable type. Does this code seem to right to you all?

class MutableTypeExample
{
    private string _test; //members are not readonly
    public string Test
    {
        get { return _test; }
        set { _test = value; } //class is mutable because it can be modified after being created
    }

    public MutableTypeExample(string test)
    {
        _test = test;
    }

    public void MakeTestFoo()
    {
        this.Test = "FOO!";
    }
}

class ImmutableTypeExample
{
    private readonly string _test; //all members are readonly
    public string Test
    {
        get { return _test; } //no set allowed
    }

    public ImmutableTypeExample(string test) //immutable means you can only set members in the consutrctor. Once the object is instantiated it cannot be altered
    {
        _test = test;
    }

    public ImmutableTypeExample MakeTestFoo()
    {
        //this.Test = "FOO!"; //not allowed because it is readonly
        return new ImmutableTypeExample("FOO!");
    }
}
like image 544
Hoody Avatar asked Aug 16 '11 13:08

Hoody


2 Answers

Yup, that looks reasonable.

However, I would also talk about "leaky" mutability. For example:

public class AppearsImmutableButIsntDeeplyImmutable
{
    private readonly StringBuilder builder = new StringBuilder();
    public StringBuilder Builder { get { return builder; } }
}

I can't change which builder an instance appears on, but I can do:

value.Builder.Append("hello");

It would be worth you reading Eric Lippert's blog post on kinds of immutability - and indeed all the rest of the posts in the series.

like image 53
Jon Skeet Avatar answered Sep 29 '22 15:09

Jon Skeet


Yes, that looks right.

Note that the private members doesn't need to be readonly for the class to be immutable, that is just an extra precaution agains broken code inside the class.

like image 39
Guffa Avatar answered Sep 29 '22 16:09

Guffa