Table of Contents
1. Introduction.......................................................................................................................................... 1
2. Style Guidelines.................................................................................................................................... 2
2.1 Tabs & Indenting................................................................................................................................ 2
2.2 Bracing............................................................................................................................................... 2
2.3 Commenting........................................................................................................................................ 2
2.3.1 Documentation Comments............................................................................................................. 2
2.3.2 Comment Style............................................................................................................................. 3
2.4 Spacing............................................................................................................................................... 3
2.5 Naming............................................................................................................................................... 4
2.6 Naming Conventions............................................................................................................................ 4
2.6.1 Interop Classes............................................................................................................................. 4
2.7 File Organization................................................................................................................................. 5
First, read the .NET Framework Design Guidelines. Almost all naming conventions, casing rules, etc., are spelled out in this document. Unlike the Design Guidelines document, you should treat this document as a set of suggested guidelines. These generally do not effect the customer view so they are not required.
Tab characters (\0x09) should not be used in code. All indentation should be done with 4 space characters.
Open braces should always be at the beginning of the line after the statement that begins the block. Contents of the brace should be indented by 4 spaces. For example:
if (someExpression){ DoSomething();}else{ DoSomethingElse();}
“case” statements should be indented from the switch statement like this:
switch (someExpression) {
case 0: DoSomething(); break;
case 1: DoSomethingElse(); break;
case 2: { int n = 1; DoAnotherThing(n); } break;}
Braces should never be considered optional. Even for single statement blocks, you should always use braces. This increases code readability and maintainability.
for (int i=0; i<100; i++) { DoSomething(i); }
Single line statements can have braces that begin and end on the same line.
public class Foo{ int bar;
public int Bar { get { return bar; } set { bar = value; } }
}
It is suggested that all control structures (if, while, for, etc.) use braces, but it is not required.
Comments should be used to describe intention, algorithmic overview, and/or logical flow. It would be ideal, if from reading the comments alone, someone other than the author could understand a function’s intended behavior and general operation. While there are no minimum comment requirements and certainly some very small routines need no commenting at all, it is hoped that most routines will have comments reflecting the programmer’s intent and approach.
Each file should start with a copyright notice. To avoid errors in doc comment builds, you don’t want to use triple-slash doc comments, but using XML makes the comments easy to replace in the future. Final text will vary by product (you should contact legal for the exact text), but should be similar to:
//-----------------------------------------------------------------------// <copyright file="ContainerControl.cs" company="Microsoft">// Copyright (c) Microsoft Corporation. All rights reserved.// </copyright>//-----------------------------------------------------------------------
All methods should use XML doc comments. For internal dev comments, the <devdoc> tag should be used.
public class Foo {
/// <summary>Public stuff about the method</summary>/// <param name=”bar”>What a neat parameter!</param>/// <devdoc>Cool internal stuff!</devdoc>///public void MyMethod(int bar) { … }
However, it is common that you would want to move the XML documentation to an external file – for that, use the <include> tag.
/// <include file='doc\Foo.uex' path='docs/doc[@for="Foo.MyMethod"]/*' /> /// public void MyMethod(int bar) { … }
UNDONE§ there is a big doc with all the comment tags we should be using… where is that?
The // (two slashes) style of comment tags should be used in most situations. Where ever possible, place comments above the code instead of beside it. Here are some examples:
// This is required for WebClient to work through the proxyGlobalProxySelection.Select = new WebProxy("http://itgproxy");
// Create object to access Internet resources//WebClient myClient = new WebClient();
Comments can be placed at the end of a line when space allows:
public class SomethingUseful { private int itemHash; // instance member private static bool hasDoneSomething; // static member}
Spaces improve readability by decreasing code density. Here are some guidelines for the use of space characters within code:
Follow all .NET Framework Design Guidelines for both internal and external members. Highlights of these include:
The reasons to extend the public rules (no Hungarian, no prefix for member variables, etc.) is to produce a consistent source code appearance. In addition a goal is to have clean readable source. Code legibility should be a primary goal.
Classes that are there for interop wrappers (DllImport statements) should follow the naming convention below:
class NativeMethods { private NativeMethods() {}
[DllImport(“user32”)] internal static extern void FormatHardDrive(string driveName);}
[SuppressUnmanagedCode]class UnsafeNativeMethods { private UnsafeNativeMethods() {}
[DllImport(“user32”)] internal static extern void CreateFile(string fileName);}
[SuppressUnmanagedCode]class SafeNativeMethods { private SafeNativeMethods() {}
[DllImport(“user32”)] internal static extern void MessageBox(string text);}
All interop classes must be private, and all methods must be internal. In addition a private constructor should be provided to prevent instantiation.
For example, I would expect to find the public class “System.Windows.Forms.Control” in “System\Windows\Forms\Control.cs”…
namespace MyNamespace {
using System;
public class MyClass : IFoo {
// fields int foo;
// constructors public MyClass() { … }
// properties public int Foo { get { … } set { … } }
// events public event EventHandler FooChanged { add { … } remove { … } }
// methods void DoSomething() { … } void FindSomethind() { … }
//private interface implementations void IFoo.DoSomething() { DoSomething(); }
// nested types class NestedType { … }