title | permalink | classes | sidebar | ||
---|---|---|---|---|---|
Naming Guidelines |
/naming-guidelines/ |
wide |
|
All type members, parameters and variables should be named using words from the American English language.
- Choose easily readable, preferably grammatically correct names. For example,
HorizontalAlignment
is more readable thanAlignmentHorizontal
. - Favor readability over brevity. The property name
CanScrollHorizontally
is better thanScrollableX
(an obscure reference to the X-axis). - Avoid using names that conflict with keywords of widely used programming languages.
Exception: In most projects, you will use words and phrases from your domain and names specific to your company. Visual Studio's Static Code Analysis performs a spelling check on all code, so you may need to add those terms to a Custom Code Analysis Dictionary.
Language element | Casing | Example |
---|---|---|
Class, Struct | Pascal | AppDomain |
Interface | Pascal | IBusinessService |
Enumeration type | Pascal | ErrorLevel |
Enumeration values | Pascal | FatalError |
Event | Pascal | Click |
Private field | Camel | listItem |
Protected field | Pascal | MainPanel |
Constant field | Pascal | MaximumItems |
Constant Local variable | Camel | maximumItems |
Read-only static field | Pascal | RedValue |
Local Variable | Camel | listOfValues |
Method | Pascal | ToString |
Local function | Pascal | FormatText |
Namespace | Pascal | System.Drawing |
Parameter | Camel | typeName |
Type Parameter | Pascal | TView |
Property | Pascal | BackColor |
Tuple element | Camel | firstName |
In most cases they are a lazy excuse for not defining a clear and intention-revealing name.
For example, don't use g_
or s_
to distinguish static from non-static fields. A method in which it is difficult to distinguish local variables from member fields is generally too big. Examples of incorrect identifier names are: _currentUser
, mUserName
, m_loginTime
.
For example, use OnButtonClick
rather than OnBtnClick
. Avoid single character variable names, such as i
or q
. Use index
or query
instead.
Exceptions: Use well-known acronyms and abbreviations that are widely accepted or well-known in your work domain. For instance, use acronym UI
instead of UserInterface
and abbreviation Id
instead of Identity
.
- Use functional names. For example,
GetLength
is a better name thanGetInt
. - Don't use terms like
Enum
,Class
orStruct
in a name. - Identifiers that refer to a collection type should have plural names.
For example, the name IComponent uses a descriptive noun, ICustomAttributeProvider uses a noun phrase and IPersistable uses an adjective.
Bad examples include SearchExamination
(a page to search for examinations), Common
(does not end with a noun, and does not explain its purpose) and SiteSecurity
(although the name is technically okay, it does not say anything about its purpose).
Don't include terms like Utility
or Helper
in classes. Classes with names like that are usually static classes and are introduced without considering object-oriented principles (see also AV1008).
- Always prefix type parameter names with the letter
T
. - Always use a descriptive name unless a single-letter name is completely self-explanatory and a longer name would not add value. Use the single letter
T
as the type parameter in that case. - Consider indicating constraints placed on a type parameter in the name of the parameter. For example, a parameter constrained to
ISession
may be calledTSession
.
class Employee
{
// Wrong!
static GetEmployee() {}
DeleteEmployee() {}
// Right
static Get() {...}
Delete() {...}
// Also correct.
AddNewJob() {...}
RegisterForMeeting() {...}
}
.NET developers are already accustomed to the naming patterns the framework uses, so following this same pattern helps them find their way in your classes as well. For instance, if you define a class that behaves like a collection, provide members like Add
, Remove
and Count
instead of AddItem
, Delete
or NumberOfItems
.
Although technically correct, statements like the following can be confusing:
bool b001 = (lo == l0) ? (I1 == 11) : (lOl != 101);
- Name properties with nouns, noun phrases, or occasionally adjective phrases.
- Name boolean properties with an affirmative phrase. E.g.
CanSeek
instead ofCannotSeek
. - Consider prefixing boolean properties with
Is
,Has
,Can
,Allows
, orSupports
. - Consider giving a property the same name as its type. When you have a property that is strongly typed to an enumeration, the name of the property can be the same as the name of the enumeration. For example, if you have an enumeration named
CacheLevel
, a property that returns one of its values can also be namedCacheLevel
.
Name a method or local function using a verb like Show
or a verb-object pair such as ShowDialog
. A good name should give a hint on the what of a member, and if possible, the why.
Also, don't include And
in the name of a method or local function. That implies that it is doing more than one thing, which violates the Single Responsibility Principle explained in AV1115.
For instance, the following namespaces are good examples of that guideline.
AvivaSolutions.Commerce.Web
NHibernate.Extensibility
Microsoft.ServiceModel.WebApi
Microsoft.VisualStudio.Debugging
FluentAssertion.Primitives
CaliburnMicro.Extensions
Note: Never allow namespaces to contain the name of a type, but a noun in its plural form (e.g. Collections
) is usually OK.
Name events with a verb or a verb phrase. For example: Click
, Deleted
, Closing
, Minimizing
, and Arriving
. For example, the declaration of the Search
event may look like this:
public event EventHandler<SearchArgs> Search;
For example, a close event that is raised before a window is closed would be called Closing
, and one that is raised after the window is closed would be called Closed
. Don't use Before
or After
prefixes or suffixes to indicate pre and post events.
Suppose you want to define events related to the deletion of an object. Avoid defining the Deleting
and Deleted
events as BeginDelete
and EndDelete
. Define those events as follows:
Deleting
: Occurs just before the object is getting deletedDelete
: Occurs when the object needs to be deleted by the event handler.Deleted
: Occurs when the object is already deleted.
It is good practice to prefix the method that handles an event with On
. For example, a method that handles the Closing
event can be named OnClosing
.
If you use a lambda expression (for instance, to subscribe to an event) and the actual arguments of the event are irrelevant, use discards to make that explicit:
button.Click += (_, _) => HandleClick();
If the name of an extension method conflicts with another member or extension method, you must prefix the call with the class name. Having them in a dedicated class with the Extensions
suffix improves readability.
The general convention for methods that return Task
or Task<TResult>
is to post-fix them with Async
, but if such a method already exists, use TaskAsync
instead.