.NET Core C# Coding Style

本文翻译并节选自微软 dotnet corefx coding style


总体上遵循 Visual Studio 默认规则。

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

        ...
    }
}
posted @ 2016-06-17 14:11  uhavemyword  阅读(503)  评论(2编辑  收藏  举报