規範
0.變數
0.0.0 命名
變數名稱應該要簡單,並能代表它的意思,表達出來。
建議
var product = new Product();
不建議
var p = new Product();
var produ = new Product();
Lambda規範
建議
products.Where(product => product ... );
不建議
products.Where(p => p ... );
關於複數,用在集合或陣列
0.0.1 複數
建議
var products = new List<Product>();
不建議
var productList = new List<Product>();
0.0.2 類型名稱
建議
var product = new Product();
不建議
var productModel = new Product();
不建議
var productObj = new Product();
1 方法
1.0 命名
方法的命名應該要執行操作的摘要,它需要保持準確和簡短
1.0.0 動詞
方法名稱中必須包含動詞來表示它執行的操作。
建議
public List<Student> GetStudents()
{
...
}
不建議
public List<Student> Students()
{
...
}
1.0.1 異步
非同步方法應該放置動詞的操作方法後面 Async
通常返回的方法應該返回 Task
或 ValueTask
。
建議
public async ValueTask<List<Student> GetStudentsAsync()
{
...
}
不建議
public async ValueTask<List<Student> GetStudents()
{
...
}
1.0.2 方法參數
方法參數應該明確說明它們給予的物件或是它的意思
建議
public async ValueTask<Student> GetStudentByNameAsync(string studentName)
{
...
}
不建議
public async ValueTask<Student> GetStudentByNameAsync(string text)
{
...
}
不建議
public async ValueTask<Student> GetStudentByNameAsync(string name)
{
...
}
1.0.3 動作參數
如果您的方法正在使用特定參數執行操作,請指定它。
建議
public async ValueTask<Student> GetStudentByIdAsync(Guid studentId)
{
...
}
不建議
public async ValueTask<Student> GetStudentAsync(Guid studentId)
{
...
}
1.0.4 傳遞參數
在使用方法時,如果輸入參數別名與傳入的變量部分或全部匹配,則不必使用別名,否則必須使用別名指定值。
假設你有一個方法:
Student GetStudentByNameAsync(string studentName);
建議
string studentName = "Todd"; Student student = await GetStudentByNameAsync(studentName);
建議
Student student = await GetStudentByNameAsync(studentName: "Todd");
建議
Student student = await GetStudentByNameAsync(toddName);
不建議
Student student = await GetStudentByNameAsync("Todd");
不建議
Student student = await GetStudentByNameAsync(todd);
1.1 組織
一般來說,將多行相同的邏輯封裝到自己的方法中,並始終將您的方法保持在細節級別 0。
1.1.0 一行的狀況
任何只包含一行代碼的方法都應該使用粗箭頭。
建議
public List<Student> GetStudents() => this.storageBroker.GetStudents();
不建議
public List<Student> Students()
{
return this.storageBroker.GetStudents();
}
如果單行方法超過 120 個字符的長度,則在粗箭頭後用一個額外的製表符換行。
1.1.1 回傳
對於多行方法,在方法邏輯和最終返回行(如果有)之間換行。
建議
public List<Student> GetStudents(){
StudentsClient studentsApiClient = InitializeStudentApiClient();
return studetnsApiClient.GetStudents();
}
不建議
public List<Student> GetStudents(){
StudentsClient studentsApiClient = InitializeStudentApiClient();
return studetnsApiClient.GetStudents();
}
1.1.2 關於呼叫
對於多個方法調用,如果兩個調用都少於 120 個字符,則它們可能會堆疊,除非最終調用是方法返回,否則用新行分隔
建議
public List<Student> GetStudents()
{
StudentsClient studentsApiClient = InitializeStudentApiClient();
List<Student> students = studetnsApiClient.GetStudents();
return students;
}
不建議
public List<Student> GetStudents()
{
StudentsClient studentsApiClient = InitializeStudentApiClient();
List<Student> students = studetnsApiClient.GetStudents();
return students;
}
建議
public List<Student> GetStudents()
{
StudentsClient washingtonSchoolsStudentsApiClient =
await InitializeWashingtonSchoolsStudentsApiClientAsync();
List<Student> students = studetnsApiClient.GetStudents();
return students;
}
不建議
public List<Student> GetStudents()
{
StudentsClient washingtonSchoolsStudentsApiClient =
await InitializeWashingtonSchoolsStudentsApiClientAsync();
List<Student> students = studetnsApiClient.GetStudents();
return students;
}
1.1.3 宣告
建議
public async ValueTask<List<Student>> GetAllRegisteredWashgintonSchoolsStudentsAsync(
StudentsQuery studentsQuery)
{
...
}
不建議
public async ValueTask<List<Student>> GetAllRegisteredWashgintonSchoolsStudentsAsync(StudentsQuery studentsQuery)
{
...
}
1.1.4 多參數
如果要傳遞多個參數,並且方法調用的長度超過 120 個字符,則必須以參數分隔,每行一個參數。
建議
List<Student> redmondHighStudents = await QueryAllWashingtonStudentsByScoreAndSchoolAsync(
MinimumScore: 130,
SchoolName: "Redmond High");
不建議
List<Student> redmondHighStudents = await QueryAllWashingtonStudentsByScoreAndSchoolAsync(
MinimumScore: 130,SchoolName: "Redmond High");
4 類別
4.0 命名
在 MBSCV 體系結構中表示服務或代理的類應在其命名約定中表示類的類型,但這不適用於模型。
4.0.0 模型
建議
class Student
{
...
}
不建議
class StudentModel
{
}
4.0.1 服務
以一種獨特的方式,對於任何包含業務邏輯的類。
建議
class StudentService { .... }
不建議
class StudentsService{ ... }
不建議
class StudentBusinessLogic
{
...
}
不建議
class StudentBL
{
...
}
4.0.3 控制器
以復數方式,反映 /api/students 等端點,以通過 RESTful 操作公開您的邏輯。
建議
class StudentsController {
....
}
不建議
class StudentController {
...
}
4.1 屬性
字段是直接在類或結構中聲明的任何類型的變量。字段是其包含類型的成員。
4.1.0 命名
類字段以駝峰式命名。
建議
class StudentsController {
private readonly string studentName;
}
不建議
class StudentController {
private readonly string StudentName;
}
不建議
class StudentController {
private readonly string _studentName;
}
應遵循與變量部分中提到的相同的命名規則。
4.1.1 參考
建議
class StudentController {
private readonly string _studentName;
public StudentsController(string studentName) {
_studentName = studentName;
}
}
不建議
class StudentsController {
private readonly string _studentName;
public StudentsController(string studentName) {
this.studentName = studentName;
}
}
4.2 實例化
4.2.0 輸入參數別名
如果輸入變量名稱與輸入別名匹配,則使用它們,否則必須使用別名,尤其是傳入的值。
建議
int score = 150;
string name = "Josh";
var student = new Student(name, score);
建議
var student = new Student(name: "Josh", score: 150);
不建議
var student = new Student("Josh", 150);
額外補充:https://www.dofactory.com/csharp-coding-standards#abbreviations
元哥的筆記