mirror of
https://github.com/VSadov/Satori.git
synced 2025-06-08 11:37:04 +09:00

style is based on the LLVM style with some minor tweaks. This commit also
ran the script against the current code to bring us into compliance. This
fixes dotnet/corefx#3051
Commit migrated from d27d8f7cd6
130 lines
5.5 KiB
Markdown
130 lines
5.5 KiB
Markdown
C# Coding Style
|
|
===============
|
|
|
|
For C++ files (*.cpp and *.h), we use clang-format (version 3.6+) to ensure code styling. After changing any Cpp or H file and before merging, be sure to run ./formatCode.sh from within the Native directory; this script will ensure that all native code files adhere to the coding style guidelines.
|
|
|
|
For non code files (xml etc) our current best guidance is consistency. When editing files, keep new code and changes consistent with the style in the files. For new files, it should conform to the style for that component. Last, if there's a completely new component, anything that is reasonably broadly accepted is fine.
|
|
|
|
The general rule we follow is "use Visual Studio defaults".
|
|
|
|
1. We use [Allman style](http://en.wikipedia.org/wiki/Indent_style#Allman_style) braces, where each brace begins on a new line. A single line statement block can go without braces but the block must be properly indented on its own line and it must not be nested in other statement blocks that use braces (See issue [381](https://github.com/dotnet/corefx/issues/381) for examples).
|
|
2. We use four spaces of indentation (no tabs).
|
|
3. We use `_camelCase` for internal and private members and use `readonly` where possible. Prefix instance fields with `_`, static fields with `s_` and thread static fields with `t_`.
|
|
4. We avoid `this.` unless absolutely necessary.
|
|
5. We always specify the visibility, even if it's the default (i.e.
|
|
`private string _foo` not `string _foo`).
|
|
6. Namespace imports should be specified at the top of the file, *outside* of
|
|
`namespace` declarations and should be sorted alphabetically, with `System.
|
|
namespaces at the top and blank lines between different top level groups.
|
|
7. Avoid more than one empty line at any time. For example, do not have two
|
|
blank lines between members of a type.
|
|
8. Avoid spurious free spaces.
|
|
For example avoid `if (someVar == 0)...`, where the dots mark the spurious free spaces.
|
|
Consider enabling "View White Space (Ctrl+E, S)" if using Visual Studio, to aid detection.
|
|
9. If a file happens to differ in style from these guidelines (e.g. private members are named `m_member`
|
|
rather than `_member`), the existing style in that file takes precedence.
|
|
10. We only use `var` when it's obvious what the variable type is (i.e. `var stream = new FileStream(...)` not `var stream = OpenStandardInput()`).
|
|
11. We use language keywords instead of BCL types (i.e. `int, string, float` instead of `Int32, String, Single`, etc) for both type references as well as method calls (i.e. `int.Parse` instead of `Int32.Parse`). See issue [391](https://github.com/dotnet/corefx/issues/391) for examples.
|
|
12. We use PascalCasing to name all our constant local variables and fields. The only exception is for interop code where the constant value should exactly match the name and value of the code you are calling via interop.
|
|
|
|
We have provided a Visual Studio 2013 vssettings file (`corefx.vssettings`) at the root of the corefx repository, enabling C# auto-formatting conforming to the above guidelines. Note that rules 7 and 8 are not covered by the vssettings, since these are not rules currently supported by VS formatting.
|
|
|
|
We also use the [.NET Codeformatter Tool](https://github.com/dotnet/codeformatter) to ensure the code base maintains a consistent style over time, the tool automatically fixes the code base to conform to the guidelines outlined above.
|
|
|
|
### Example File:
|
|
|
|
``ObservableLinkedList`1.cs:``
|
|
|
|
```C#
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
|
|
using Microsoft.Win32;
|
|
|
|
namespace System.Collections.Generic
|
|
{
|
|
public partial class ObservableLinkedList<T> : INotifyCollectionChanged, INotifyPropertyChanged
|
|
{
|
|
private ObservableLinkedListNode<T> _head;
|
|
private int _count;
|
|
|
|
public ObservableLinkedList(IEnumerable<T> items)
|
|
{
|
|
if (items == null)
|
|
throw new ArgumentException("items");
|
|
|
|
foreach (T item in items)
|
|
{
|
|
AddLast(item);
|
|
}
|
|
}
|
|
|
|
public event NotifyCollectionChangedEventHandler CollectionChanged;
|
|
|
|
public int Count
|
|
{
|
|
get { return _count; }
|
|
}
|
|
|
|
public ObservableLinkedListNode AddLast(T value)
|
|
{
|
|
var newNode = new LinkedListNode<T>(this, value);
|
|
|
|
InsertNodeBefore(_head, node);
|
|
}
|
|
|
|
protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
|
|
{
|
|
NotifyCollectionChangedEventHandler handler = CollectionChanged;
|
|
if (handler != null)
|
|
{
|
|
handler(this, e);
|
|
}
|
|
}
|
|
|
|
private void InsertNodeBefore(LinkedListNode<T> node, LinkedListNode<T> newNode)
|
|
{
|
|
...
|
|
}
|
|
|
|
...
|
|
}
|
|
}
|
|
```
|
|
|
|
``ObservableLinkedList`1.ObservableLinkedListNode.cs:``
|
|
|
|
```C#
|
|
using System;
|
|
|
|
namespace System.Collections.Generics
|
|
{
|
|
partial class ObservableLinkedList<T>
|
|
{
|
|
public class ObservableLinkedListNode
|
|
{
|
|
private readonly ObservableLinkedList<T> _parent;
|
|
private readonly T _value;
|
|
|
|
internal ObservableLinkedListNode(ObservableLinkedList<T> parent, T value)
|
|
{
|
|
Debug.Assert(parent != null);
|
|
|
|
_parent = parent;
|
|
_value = value;
|
|
}
|
|
|
|
public T Value
|
|
{
|
|
get { return _value; }
|
|
}
|
|
}
|
|
|
|
...
|
|
}
|
|
}
|
|
```
|