Field Usage Guidelines
The following rules outline the usage guidelines for fields:
Do not use instance fields that are public or protected (Public or Protected in Visual Basic). If you avoid exposing fields directly to the developer, classes can be versioned more easily because a field cannot be changed to a property while maintaining binary compatibility. Consider providing get and set property accessors for fields instead of making them public. The presence of executable code in get and set property accessors allows later improvements, such as creation of an object on demand, upon usage of the property, or upon a property change notification. The following code example illustrates the correct use of private instance fields with get and set property accessors.
Public Structure Point Private xValue As Integer Private yValue As Integer Public Sub New(x As Integer, y As Integer) Me.xValue = x Me.yValue = y End Sub Public Property X() As Integer Get Return xValue End Get Set xValue = value End Set End Property Public Property Y() As Integer Get Return yValue End Get Set yValue = value End Set End Property End Structure [C#] public struct Point { private int xValue; private int yValue; public Point(int x, int y) { this.xValue = x; this.yValue = y; } public int X { get { return xValue; } set { xValue = value; } } public int Y { get { return yValue; } set { yValue = value; } } }
Expose a field to a derived class by using a protected property that returns the value of the field. This is illustrated in the following code example.
Public Class Control Inherits Component Private handle As Integer Protected ReadOnly Property Handle() As Integer Get Return handle End Get End Property End Class [C#] public class Control: Component { private int handle; protected int Handle { get { return handle; } } }
Use the const (Const in Visual Basic) keyword to declare constant fields that will not change. Language compilers save the values of const fields directly in calling code.
Use public static read-only fields for predefined object instances. If there are predefined instances of an object, declare them as public static read-only fields of the object itself. Use Pascal case because the fields are public. The following code example illustrates the correct use of public static read-only fields.
Public Structure Color Public Shared Red As New Color(&HFF) Public Shared Green As New Color(&HFF00) Public Shared Blue As New Color(&HFF0000) Public Shared Black As New Color(&H0) Public Shared White As New Color(&HFFFFFF) Public Sub New(rgb As Integer) ' Insert code here. End Sub Public Sub New(r As Byte, g As Byte, b As Byte) ' Insert code here. End Sub Public ReadOnly Property RedValue() As Byte Get Return Color End Get End Property Public ReadOnly Property GreenValue() As Byte Get Return Color End Get End Property Public ReadOnly Property BlueValue() As Byte Get Return Color End Get End Property End Structure [C#] public struct Color { public static readonly Color Red = new Color(0x0000FF); public static readonly Color Green = new Color(0x00FF00); public static readonly Color Blue = new Color(0xFF0000); public static readonly Color Black = new Color(0x000000); public static readonly Color White = new Color(0xFFFFFF); public Color(int rgb) { // Insert code here.} public Color(byte r, byte g, byte b) { // Insert code here.} public byte RedValue { get { return Color; } } public byte GreenValue { get { return Color; } } public byte BlueValue { get { return Color; } } }
Spell out all words used in a field name. Use abbreviations only if developers generally understand them. Do not use uppercase letters for field names. The following is an example of correctly named fields.
Class SampleClass Private url As String Private destinationUrl As String End Class [C#] class SampleClass { string url; string destinationUrl; }
Do not use Hungarian notation for field names. Good names describe semantics, not type.
Do not apply a prefix to field names or static field names. Specifically, do not apply a prefix to a field name to distinguish between static and nonstatic fields. For example, applying a
g_
ors_
prefix is incorrect.
See Also
Design Guidelines for Class Library Developers | Class Member Usage Guidelines | Static Field Naming Guidelines