CA1051: Do not declare visible instance fields
Note
This article applies to Visual Studio 2015. If you're looking for the latest Visual Studio documentation, see Visual Studio documentation. We recommend upgrading to the latest version of Visual Studio. Download it here
Item | Value |
---|---|
TypeName | DoNotDeclareVisibleInstanceFields |
CheckId | CA1051 |
Category | Microsoft.Design |
Breaking Change | Breaking |
Cause
An externally visible type has an externally visible instance field.
Rule Description
The primary use of a field should be as an implementation detail. Fields should be private
or internal
and should be exposed by using properties. It is as easy to access a property as it is to access a field, and the code in the accessors of a property can change as the features of the type expand without introducing breaking changes. Properties that just return the value of a private or internal field are optimized to perform on par with accessing a field; very little performance gain is associated with the use of externally visible fields over properties.
Externally visible refers to public
, protected
, and protected internal
(Public
, Protected
, and Protected Friend
in Visual Basic) accessibility levels.
How to Fix Violations
To fix a violation of this rule, make the field private
or internal
and expose it by using an externally visible property.
When to Suppress Warnings
Do not suppress a warning from this rule. Externally visible fields do not provide any benefits that are unavailable to properties. Additionally, public fields cannot be protected by Link Demands. See CA2112: Secured types should not expose fields.
Example
The following example shows a type (BadPublicInstanceFields
) that violates this rule. GoodPublicInstanceFields
shows the corrected code.
using System;
namespace DesignLibrary
{
public class BadPublicInstanceFields
{
// Violates rule DoNotDeclareVisibleInstanceFields.
public int instanceData = 32;
}
public class GoodPublicInstanceFields
{
private int instanceData = 32;
public int InstanceData
{
get { return instanceData; }
set { instanceData = value ; }
}
}
}
Related Rules
CA2112: Secured types should not expose fields