对于编程中非代码文件(例如xml 等),我们目前的最佳指南是代码风格的一致性。编辑代码文件时,需要保持新增/更改的代码与原文件中的代码风格一致性。对于新建的代码文件,它也应符合本编码规范。好的编码规范,有利于提升代码的可读性。.NET Core 框架项目使用的是 Visual Studio 默认编码规范。
通常,我们编码时,应遵循 Visual Studio 默认编码规范中的以下规则:
1、接口名、类名、方法名、参数名和变量名
所有的接口名、类名和方法名都应该使用 PascalCasing
风格来定义,对于接口参数、构造函数参数和方法参数,其参数名则使用 camelCase
风格。对于方法体内的局部变量,则使用 camelCase
风格。
2、花括号
使用 Allman
样式的花括号,每个花括号在新的一行开始,而且花括号不进行缩进,花括号里面的代码缩进。
while (x == y)
{
something();
somethingelse();
}
对于单行语句块,可以不带花括号,但需要把它放在同一行
if (xx == null) xx = new Foo();
一个例外是,允许 using 语句嵌套在另一个 using 语句中,从同一缩进级别的下一行开始,即使嵌套的 using 包含受控块也是如此。
3、空格
使用 4 个空格作为一个缩进,而不是使用 tab。
4、字段
所有的 internal
和 private
字段使用 _camelCase
风格,即在字段添加 _
前缀,并尽可能使用 readonly
。对于静态字段添加 s_
前缀,对于线程静态字段添加 t_
前缀。如果使用了静态的字段而且可以设置 readonly
,需要把 readonly
放在 static
后面(即 static readonly
而不是 readonly static
)。公开(public)字段应谨慎使用,如果需要公开字段,则应使用 PascalCasing
风格,并且不带前缀。
5、限定
除非绝对必要,应避免使用 this.
。在扩展方法中,需要使用 this
。
6、访问修饰
即使访问可见性是默认的,我们也要始终指定,我们也总是指定可见性(例如, private string _foo
而不是 string _foo
)。访问可见性应该是第一个修饰符(例如, public abstract
而不是 abstract public
)
7、命名空间
命名空间导入应在命名空间声明之外的文件顶部指定,并且应按字母顺序排序,但 System.* 命名空间除外,这些命名空间应放置在所有其他名称空间的顶部。
8、空行
随时避免出现多个空白行。例如,类型的成员之间不要有两个空白行。
9、多余空格
避免多余的空格。例如,避免 if(someVar == 0)...
,其中点标记为多余空格。如果使用 Visual Studio 辅助检测,通过启用 Visual Studio中“查看空格(Ctrl + R,Ctrl + W)”或“编辑->高级->查看空格”。
10、隐式类型
仅在明显可以知道对象类型时,可以使用 var
,如 var stream = new FileStream(...)
。在无法明显知道对象类型时,不可以使用 var
,如 var stream = OpenStandardInput()
。
11、关键字
使用语言的关键字代替 BCL 类型,如使用 int, string, float
代替 Int32,String,Single
。
12、常量命名
我们使用 PascalCasing
风格来命名所有常量局部变量和字段。唯一的例外是互操作代码,其中常量值应与您通过互操作调用的代码的名称和值完全匹配。
13、变量名字符串
如果使用变量名的常量,必须使用 nameof
关键字。
14、其它字符
在源代码中包含非 ASCII 字符时,需要使用 Unicode 转义序列(\uXXXX)代替文字字符。文字非 ASCII 字符有时会被工具或编辑器弄乱。
15、条件约定
如果使用条件语句,则遵循以下约定:
if(source == null) throw new ArgumentNullException("source")
if/else if/.../else
if/else if/.../else
16、代码格式工具
我们也可以使用 .NET Codeformatter 工具 来确保代码库随时间推移保持一致的样式,该工具会自动修复代码库以符合上述准则。
17、示例文件
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; }
}
}
...
}
}
全文完,本文部分摘译自 C# Coding Style (https://github.com/dotnet/corefx/blob/master/Documentation/coding-guidelines/coding-style.md)。
声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。
作者:彭智勇
来源:https://pzy.io/archives/2019/11/csharp-coding-guidelines.html?utm_source=tuicool&utm_medium=referral
More:【微信公众号】 u3dnotes
本文分享自微信公众号 - Unity3D游戏开发精华教程干货(u3dnotes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4589456/blog/4432218