# 三、为 .NET Core 仓库做贡献

那个。NET Core 项目已经开发出来，现在正在 GitHub 上以开源的方式进行维护。然而，就像每个项目一样，为了成为“好公民”，你必须遵循一些编码规则和行为准则。在这一章中，我们将讲述如果你想为这个项目做贡献，你必须遵循的编码准则。

在某个时间点，团队将根据编码指南(我们将在本章后面讨论)重新设计项目的完整代码库。同时，您应该:

*   `NOT`发送样式更改的 PRs。例如，不要发送 PRs 将所有出现的 Int32 重命名为 Int。
*   `NOT`发送 PRs 以升级代码，从而使用更新的语言功能。这些特性可以在新代码中使用，但是对于现有代码来说，这是一个全新的东西。
*   `GIVE`优先考虑您正在更改的项目或文件的当前样式，即使它偏离了一般准则。
*   `NOT `向*主*分支机构提交已全部装运的任何类型的原料药增补。NET 框架。此外，不要向尚未批准的原料药提交公关。
*   `INCLUDE `添加新功能时进行测试。修复 bug 时，首先添加一个测试，突出显示当前行为是如何被破坏的。
*   `KEEP`讨论集中。
*   `NOT`用大拉请求给团队惊喜。相反，提出一个问题并开始讨论，这样团队可以帮助你的发展。
*   `NOT`提交没有写的代码。如果您发现您认为很适合添加的代码。NET Core，提出一个问题并开始讨论，然后再继续。
*   `NOT`提交更改许可相关文件或标题的 PRs。

一般规则是遵循 Visual Studio 默认值。然而，还有一些更详细的案例。对于 C++文件(*。cpp 和*。h)，您应该使用 clang-format(3.6+版)。更改任何 C++或 H 文件后，合并前，运行位于`src/Native/format-code.sh`的 shell 脚本；该脚本将确保所有本机代码文件都遵循编码风格准则。

对于非代码文件(。xml 等。)没有具体的规则，但一般来说，您应该享有与已经编写的内容保持一致的特权。编辑文件时，保持新代码和更改与文件中的样式一致。在新文件的情况下，您应该继续遵循相同类型的其他文件中使用的约定。最后但并非最不重要的一点:运用良好的判断力。如果一个组件是新的，一定要使用在那种情况下被广泛认为是合适的。

使用 GitHub 上的官方项目文档作为来源，这里是您应该遵循的完整指南列表:

1.  我们使用 [Allman 样式](http://en.wikipedia.org/wiki/Indent_style#Allman_style)大括号，其中每个大括号都从一个新行开始。一个单行语句块可以不带大括号，但是该块必须在自己的行上适当缩进，并且不能嵌套在使用大括号的其他语句块中(参见[第 381 期](https://github.com/dotnet/corefx/issues/381)的示例)。
2.  我们使用四个空格的缩进(没有制表符)。
3.  内部和私有字段我们用``_camelCase`` ，可能的话用 ``readonly`` 。用``_`` 给实例字段加前缀，用``s_`` 给静态字段加前缀，用``t_`` 给线程静态字段加前缀。在静态字段上使用时，``readonly`` 应该在静态之后(即``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，请考虑启用“查看空白(Ctrl+E，S)”，以帮助检测。
9.  如果文件的样式与这些准则不同(例如，私有成员的名称为``m_member`` ，而不是``_member`` ，则该文件中的现有样式优先。
10.  我们只在很明显变量类型是什么的时候使用``var`` (即``var stream = new FileStream(...)`` 而不是``var stream = OpenStandardInput()` )` 。
11.  我们用语言关键词代替 BCL 类型(即``int`` 、``string`` 、``float`` 代替``Int32`` 、``String`` 、``Single`` 等。)对于类型引用和方法调用(即``int.Parse`` 而不是``Int32.Parse` )` 。
12.  我们使用 PascalCasing 来命名所有的常量局部变量和字段。唯一的例外是互操作代码，其中常量值应该与您通过互操作调用的代码的名称和值完全匹配。
13.  我们用``nameof(...)`` 代替“``...`` ”只要有可能和相关。
14.  如果你认为遵循这些规则会很难，不要担心——团队已经提供了一个`.vssettings`文件来自动正确设置 Visual Studio 格式。该文件位于`corefx`回购的根目录。此外，有一个基于罗斯林的工具，你可以用来检查你的代码的“健康”。这个工具叫做`CodeFormatter`，在项目内部被积极使用。这里有[。](https://github.com/dotnet/codeformatter)

在开源项目中，许可是关键。麻省理工学院的许可证主要由。NET Core，但微软生产的发行版。NET Core 使用。NET 库许可证。那个。NET Core repo 也可能包含不同许可的来源，团队在需要时会在第三方通知中概述它们。。NET Core 二进制文件是单独生产和许可的。