Search code examples
c#coding-style

What's the best way to layout a C# class?


Is there a standard way of laying out a C# file? As in, Fields, then Properties, then Constructors, etc?

Here's what I normally do, but I'm wondering if there's a standard way?

  1. Nested Classes or Enums
  2. Fields
  3. Properties
  4. Events
  5. Constructors
  6. Public Methods
  7. Private Methods

Do people group their fields together, or do they put them with the properties? Or do people not worry about an order? Visual Studio seems to make it so hard to do.

Edit: Moved other part about ReSharper here: Make Resharper respect your preference for code order.


Solution

  • I tend to use Microsoft StyleCop, which has a set order according to rule SA1201:

    Cause An element within a C# code file is out of order in relation to the other elements in the code.

    Rule Description A violation of this rule occurs when the code elements within a file do not follow a standard ordering scheme.

    To comply with this rule, elements at the file root level or within a namespace must be positioned in the following order:

    • Extern Alias Directives
    • Using Directives
    • Namespaces
    • Delegates
    • Enums
    • Interfaces
    • Structs
    • Classes

    Within a class, struct, or interface, elements must be positioned in the following order:

    • Fields
    • Constructors
    • Finalizers (Destructors)
    • Delegates
    • Events
    • Enums
    • Interfaces
    • Properties
    • Indexers
    • Methods
    • Structs
    • Classes

    Complying with a standard ordering scheme based on element type can increase the readability and maintainability of the file and encourage code reuse.

    When implementing an interface, it is sometimes desirable to group all members of the interface next to one another. This will sometimes require violating this rule, if the interface contains elements of different types. This problem can be solved through the use of partial classes.

    1. Add the partial attribute to the class, if the class is not already partial.

    2. Add a second partial class with the same name. It is possible to place this in the same file, just below the original class, or within a second file.

    3. Move the interface inheritance and all members of the interface implementation to the second part of the class.