We recommend using Visual Studio 2017

CA2104: Do not declare read only mutable reference types


The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at CA2104: Do not declare read only mutable reference types.

|Breaking Change|Non-breaking|

An externally visible type contains an externally visible read-only field that is a mutable reference type.

A mutable type is a type whose instance data can be modified. The System.Text.StringBuilder class is an example of a mutable reference type. It contains members that can change the value of an instance of the class. An example of an immutable reference type is the System.String class. After it has been instantiated, its value can never change.

The read-only modifier (readonly in C#, ReadOnly in Visual Basic, and const in C++) on a reference type field (pointer in C++) prevents the field from being replaced by a different instance of the reference type. However, the modifier does not prevent the instance data of the field from being modified through the reference type.

Read-only array fields are exempt from this rule but instead cause a violation of the CA2105: Array fields should not be read only rule.

To fix a violation of this rule, remove the read-only modifier or, if a breaking change is acceptable, replace the field with an immutable type.

It is safe to suppress a warning from this rule if the field type is immutable.

The following example shows a field declaration that causes a violation of this rule.

using System;
using System.Text;

namespace SecurityLibrary
    public class MutableReferenceTypes
        static protected readonly StringBuilder SomeStringBuilder;

        static MutableReferenceTypes()
            SomeStringBuilder = new StringBuilder();