本文翻译并节选自微软 dotnet corefx coding style
总体上遵循 Visual Studio 默认规则。
- 使用 Allman风格 大括号,即每个大括号占用一行。单行语句块可以不加大括号,但必须恰当地缩进,而且不能嵌套在其它使用大括号的语句块里。
- 使用4个空格表示1个缩进 (不使用Tab)。
- 使用
_camelCase
风格来命名内部和私有字段 (internal and private fields),并尽可能加上readonly
。实例字段加前缀_
,静态字段加前缀s_
,线程静态字段加前缀t_
。对于静态字段,readonly
应放在static
之后 (即static readonly
而非readonly static
)。 - 非绝对必要时,避免使用
this.
关键字。 - 总是指定成员的可见性,包括缺省默认 (即
private string _foo
而非string _foo
)。可见性应为第一个修饰符 (即public abstract
而非abstract public
)。 - 导入命名空间的语句应放在文件顶部,在
namespace
声明的外部并按字母顺序排序。 - 避免出现两个及以上空行。
- 避免不必要的空格,例如
if (someVar == 0)...
语句后面点号所代表的空白。如果使用Visual Studio,可以通过"View White Space (Ctrl+E, S)"来帮助检测这些空白。 - 如果现有文件的代码风格与这些准则不太一样 (例如私有成员命名为
m_member
而不是_member
), 则以原有的代码风格为准。 - 只有在明显知道变量类型的情况下才使用
var
(即var stream = new FileStream(...)
而非var stream = OpenStandardInput()
)。 - 使用C#语言的关键字来声明类型,而不采用BCL类型 (即
int, string, float
而不是Int32, String, Single
,等)。对于方法调用也是如此 (即int.Parse
而非Int32.Parse
)。 - 使用Pascal大小写风格来命名常量。
- 使用
nameof(...)
代替"..."
。
Example File:
ObservableLinkedList`1.cs:
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 ArgumentNullException(nameof(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:
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; }
}
}
...
}
}