== Why is this an issue?

include::../description.adoc[]

Note that due to optimizations on simple properties, public fields provide only very little performance gain.

include::../impacts.adoc[]

=== Exceptions

Fields marked as `readonly` or `const` are ignored by this rule.

Fields inside classes or structs annotated with `[StructLayout]` are ignored by this rule.

Fields inside classes or structs annotated with `[Serializable]` are ignored by this rule unless they are annotated with `[NonSerialized]`.

== How to fix it

Depending on your needs:

* Use auto-implemented properties: +
For common cases, where no validation is required, auto-implemented properties are a good alternative to fields: these allows fine grained access control and offers the flexibility to add validation or change internal storage afterwards. 
__Note:__ as a bonus it is now possible to monitor value changes using breakpoints.

* Encapsulate the fields in your class. To do so:

 . Make the field private.
 . Use public properties (set and get) to access and modify the field.

* Mark field as `readonly` or `const`.

=== Code examples

==== Noncompliant code example

[source,csharp,diff-id=1,diff-type=noncompliant]
----
public class Foo
{
    public int InstanceData = 32; // Noncompliant
    public int AnotherInstanceData = 32; // Noncompliant
    
}
----

==== Compliant solution

[source,csharp,diff-id=1,diff-type=compliant]
----
public class Foo
{
    // using auto-implemented properties
    public int InstanceData { get; set; } = 32;

    // using field encapsulation
    private int _anotherInstanceData = 32;

    public int AnotherInstanceData
    {
        get { return _anotherInstanceData; }
        set
        {
            // perform validation
            _anotherInstanceData = value;
        }
    }

}
----

=== Pitfalls

Please be aware that changing a field by a property in a software that uses serialization could lead to binary incompatibility.


include::../see.adoc[]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Make this field 'private' and encapsulate it in a 'public' property.


=== Highlighting

Field identifier.


'''
== Comments And Links
(visible only on this page)

include::../comments-and-links.adoc[]

endif::env-github,rspecator-view[]
