I am wondering how immutability is defined? If the values aren’t exposed as public, so can’t be modified, then it’s enough?
Can the values be modified inside the type, not by the customer of the type?
Or can one only set them inside a constructor? If so, in the cases of double initialization (using the this keyword on structs, etc) is still ok for immutable types?
How can I guarantee that the type is 100% immutable?
No, because you need read access.
No, because that’s still mutation.
Ding ding ding! With the additional point that immutable types often have methods that construct and return new instances, and also often have extra constructors marked
internalspecifically for use by those methods.In .Net it’s tricky to get a guarantee like this, because you can use reflection to modify (mutate) private members.