== Why is this an issue?

Properties provide a way to enforce https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)[encapsulation] by providing property procedures that give controlled access to `Private` fields. However, in classes with multiple fields, it is not unusual that https://en.wikipedia.org/wiki/Copy-and-paste_programming[copy-and-paste] is used to quickly create the needed properties, which can result in the wrong field being accessed by the property procedures.

[source,vbnet]
----
Class C
    Private _x As Integer
    Private _Y As Integer

    Public ReadOnly Property Y As Integer
        Get
            Return _x ' Noncompliant: The returned field should be '_y'
        End Get
    End Property
End Class
----

This rule raises an issue in any of these cases:

* A get procedure does not access the field with the corresponding name.
* A set procedure does not update the field with the corresponding name.

For simple properties, it is better to use https://learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/auto-implemented-properties[auto-implemented properties] (VB.NET 10.0 or later).

Field and property names are compared as case-insensitive. All underscore characters are ignored.

== How to fix it

=== Code examples

==== Noncompliant code example

[source,vbnet,diff-id=1,diff-type=noncompliant]
----
Public Class Sample

    Private _x As Integer
    Private _y As Integer

    Public Property Y As Integer
        Get
            Return _x   ' Noncompliant: field '_y' is not used in the return value
        End Get
        Set(value As Integer)
            _x = value  ' Noncompliant: field '_y' is not updated
        End Set
    End Property

End Class
----

==== Compliant solution

[source,vbnet,diff-id=1,diff-type=compliant]
----
Public Class Sample

    Private _x As Integer
    Private _y As Integer

    Public Property Y As Integer
        Get
            Return _y
        End Get
        Set(value As Integer)
            _y = value
        End Set
    End Property

End Class
----

== Resources

* Microsoft Learn: https://learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/property-procedures[Property Procedures (Visual Basic)]

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

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

include::../message.adoc[]

include::../highlighting.adoc[]

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