金昌路盒宜科技股份有限公司

【编码表率篇】| C#编码表率 代码表率记忆,包括定名表率,代码表率 扫视表率等

发布日期:2024-06-30 22:15    点击次数:139

【编码表率篇】| C#编码表率 代码表率记忆,包括定名表率,代码表率 扫视表率等

🎬 博客主页:https://xiaoy.blog.csdn.net

🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉

🎄 学习专栏保举:Unity宏构学习专栏

🌲 游戏制作专栏保举:游戏制作共享

🌲Unity实战100例专栏保举:Unity 实战100例 教程

🏅 接待点赞 👍 储藏 ⭐留言 📝 如有极度敬请指正!

📆 明天很长,值得咱们全力奔赴更好意思好的活命✨

------------------❤️分割线❤️-----------------------

弁言

在咱们要领员日常开导的过程中,会编写代码是一个最基本且老例的操作。

而当作别称及格的软件工程师,出居品就应该具备工程的健壮性和好意思不雅性,因此编码表率是当作软件工程师的行状教授。

然而就 编码表率 而言,可能大多数要领员都是按照我方的恒久俗例进行代码编写,并莫得谨守一个商定好的编码表率。

是以本篇就来对C#中的编码表率作念一个细心的记忆整理,并对一些超等常用的作念一个要点解析!

关于编程而言,大多数谈话的编码表率基本上是谨守一些交流的表率规范的,猬缩少些个谈话有一些特殊用法以外。

是以本篇著作不啻对使用C#工程师们有匡助哦,不使用C#的小伙伴也不错望望跟我方平时用的谈话有什么编码各异吧!

【编码表率篇】| C# 代码表率记忆,包括定名表率,代码表率 扫视表率等

图片

一、编码表率 1.1 什么是编码表率 / Coding standards ? Coding standards are collections of rules and guidelines that determine the programming style, procedures, and methods for a programming language.Think of coding standards as a set of rules, techniques, and best practices to create cleaner, more readable, more efficient code with minimal errors. They offer a uniform format by which software engineers can use to build sophisticated and highly functional code. 编码表率是针对某种编程谈话的,决定编程立场、过程和纪律的一系列法则和招引看法的联结。把编码表率看作是一套法则、手艺和最好实行,以创建更清爽、更可读、更灵验的代码,并将极度降到最低。它们提供了一个长入的体式,软件工程师不错用它来构建复杂和功能弘远的代码。 1.2 编码表率必要性 当作别称及格的软件工程师,出居品就应该具备工程的健壮性和好意思不雅性,因此编码表率是当作软件工程师的行状教授。淌若在学习编程的初期,还是细致学习过编码表率的话,那当然是莫得什么任何问题的。然而关于好多入门者来说,可能对这方面并莫得醉心起来,如故依据我方的想法对变量和纪律等等应酬定名。代码不表率关于已毕技俩中的功能来说并莫得什么太大的问题,这就好比一个东说念主懂不懂规矩同样,同样不错活的运用自由。而对咱们亲手编写的代码有一个表率化的处置则是咱们对编程的一个最基本的尊重。是以相等冷落入门者们一定要对编码表率多用点心,唯有初期对这方面有一个基本的解析就不错养成一个好俗例,开脱东横西倒的代码啦!淌若莫得事先法例通盘团队成员应该驯顺的表率,会导致裁减工程师的积极性、加多开导时分、产生复杂的代码结构等等情况。

  淌若莫得编码表率,团队中的每个东说念主都按我方的编码立场来。在不久的将来,爱戴和调试代码将变得羁系易。

  有一套编码规范在手,更容易保合手代码的清亮和易于谄媚。虽然,规范因愚弄、性质、行业、技俩、开导东说念主员妙技和多种身分而不同。 关于一个开导团队来说,在开导过程中领有符合的编码表率和规范是至关遑急的,这将有助于团队保合手代码质料,并减少新的开导东说念主员试图交融复杂的代码库所破耗的时分。

1.3 编码表率优点 可灵验的提高代码质料,并易于爱戴减少代码的复杂性易于团队合作,裁减开导本钱为不同工程师创建的代码提供长入表率创建出可复用的代码使得检测极度愈加容易使代码更苟简,更可读,更容易爱戴促进更合理的编程实行,擢升要领员的成果,更快完成指标编码指南有助于在早期阶段发现极度,是以它有助于减少软件技俩的特等本钱。减少了开导软件的掩饰本钱。 二、定名表率

C# 的定名有两种商定:帕斯卡拼写法(Pascal) 和 驼峰定名法(camelCasing)

帕斯卡拼写法(Pascal): 成员名的每个单词的首位字母大写,如:Student,StudentName,StudentParentName。驼峰定名法(camelCasing):成员名除了第一个单词外其余首字母都大写,Student,studentName,studentParentName. 2.1 帕斯卡拼写法(Pascal)

1.class、record及record的参数、struct的称号,如:

public class DataService
{
}

public record PhysicalAddress(
    string Street,
    string City,
    string StateOrProvince,
    string ZipCode);
    
public struct ValueCoordinate
{
}

2.定名 interface 时,使用 pascal 大小写并在称号前边加向前缀 I。 这不错明晰地向使用者标明这是 interface。

public interface IWorkerQueue
{
}

3.public的成员也应为Pascal定名,这些成员包括字段、属性、事件。 纪律名也应谨守Pascal定名,不管其是否是public。如:

public class ExampleEvents
{
	//各人字段
	public bool IsValid;
	//各人属性
	public IWorkQueue WorkQueue{get;set;}
	//各人事件
	public event Action EventProcessing;
	//各人纪律
	public void Run()
	{
	}
}

4.编写位置纪录时,对参数使用 pascal 大小写,因为它们是纪录的各人属性。

public record PhysicalAddress(
    string Street,
    string City,
    string StateOrProvince,
    string ZipCode);
2.2 驼峰定名法(camelCasing)

1.定名private或internal字段时使用驼峰定名,且字段名应以_开端。如:

public class DataService
{
    private IWorkerQueue _workerQueue;
}

2.淌若是static的private或internal的字段,则字段名应该以s_开端,关于线程静态则应该使用t_开端。如:

public class DataService
{
    private static IWorkerQueue s_workerQueue;

    [ThreadStatic]
    private static TimeSpan t_timeSpan;
}

3.编写纪律的参数名时,也应该以驼峰定名,如:

public T SomeMethod<T>(int someNumber, bool isValid)
{
}
2.3 其他定名商定 在不包括 using 指示的示例中,使用定名空间限定。

淌若你知说念定名空间默许导入技俩中,则不必十足限定来自该定名空间的称号。 淌若关于单行来说过长,则不错在点 (.) 后中断限定称号,如底下的示例所示。

var currentPerformanceCounterCategory = new System.Diagnostics.
    PerformanceCounterCategory();

不必鼎新使用 Visual Studio 蓄意器用具创建的对象的称号以使它们适当其他准则。

代码中当且仅当专有成员不错使用下划线_首先代码中的定名严禁使用拼音与英文混杂的姿色,更不可允许径直使用中语的姿色。常量定名一说念大写,单词间用下划线离隔,骁勇语意抒发齐全明晰,不要嫌名字长。
正例:MAX_XIAOY_COUNT
反例:MAX_xiaoy_COUNT
概述类 定名使用 Abstract或Base开端;异常类定名使用Exception收尾;测试类定名以它要测试的类称号首先,以Test收尾。
	/// <summary>
    /// 概述类定名
    /// </summary>
	public void AbstractLearnProgramming()
    {
    }
	/// <summary>
    /// 异常类定名
    /// </summary>
	public void LearnProgrammingException()
	{
	}
	/// <summary>
    /// 测试类定名
    /// </summary>
	public void LearnProgrammingTest()
	{
	}
淌若使用了蓄意情势,冷落在类名中体现出具体情势。

评释:将蓄意情势体当今名字中,成心于阅读者快速交融架构蓄意念念想。 举例:

  public class SysuserController
  public class OrderFactory
  public class TcpProxy
罗列 类名冷落带上E前缀或Enum后缀,罗列成员称号需要全大写,单词间用下滑线离隔。

评释:罗列其实即是特殊的常量类i,切构造纪律被默许强制是专有。 正例:罗列名字:EState / DealStatusEnum 成员名:SUCCESS / UNKOWN_REASON

三、布局表率

1.使用默许的代码裁剪器修复(智能缩进、4 字符缩进、制表符保存为空格)。

2.每行只写一条语句。

    //正确
    int age = 20;
    int score = 90;

    //极度示范
    int age = 20; int score = 90;

3.每行只写一个声明。

4.C# 的大括号摄取的是Allman style,大括号单唯一转。以下是正确的:

    /// <summary>
    /// 正确示范
    /// </summary>
    public void StartGame()
    {
    }

    /// <summary>
    /// 极度示范
    /// </summary>
    public void StartGame(){
    }

5.淌若一语气行未自动缩进,请将它们缩进一个制表符位(四个空格)。

图片

6.在纪律界说与属性界说之间添加至少一个空缺行。

    public string Name { get; set; }

    public void StartGame()
    {
    }

7.使用括号卓越抒发式中的子句,如底下的代码所示。

if ((val1 > val2) && (val1 > val3))
{
    // Take appropriate action.
}

8.if / for / while / switch / do 等保留字与傍边括号之间都必须加空格。

9.任何运算符傍边必须加一个空格。

评释:运算符包括赋值运算符 = 、逻辑运算符&&、加减乘除标记、三目运算符等。

10.纪律参数在界说和传入时,多个参数逗号后必须加空格。 正例:下例中实参的 ” a ” ,后边必须要有一个空格。

XIaoYMethod("a", "b", "c");
四、扫视表率

1.将注开释在单独的行上,而非代码行的末尾。

正确示范

    // 界说age并运行化. Define age and init.
    int age = 20;

极度示范

    int age = 20;//界说age并运行化

2.类纪律的扫视必须使用C# Summary 表率,以大写字母首先扫视文本。

    /// <summary>
    /// Start the text with a capital letter.
    /// </summary>
    public void StartGame()
    {
    }

评释:在vs中,Summary姿色会教导关系的扫视,生成Summary不错正确输出相应的扫视。工程调用纪律是,不参预纪律,即可悬浮教导纪律、参数、复返值的意念念,提高阅读成果。

3.以句点完毕扫视文本。

4.在扫视分隔符 (//) 与扫视文本之间插入一个空格,如底下的示例所示。

// The following declaration creates a query. It does not run
// the query.

5.请勿在扫视周围创建体式化的星号块。

6.请确保通盘各人成员Public都有必要的扫视,从而提供关联其活动的符合评释。

7.通盘的概述纪律(包括接口中的纪律)必须使用Summary扫视,除了复返值、参数、异常评释外,还必须指出该纪律作念了什么事,已毕了什么功能。 评释:关于子类的已毕要求,或者调用留意事项,请一并评释。

8.纪律里面单行扫视,在被扫视语句上方另起一转,使用 // 扫视。纪律里面多行扫视使用 /* */ 扫视,留意与代码对都。

9.语气 “ 半吊子 ” 英文来扫视,不如用中语扫视把问题评释晰。但专闻明字与要津字保合手英文原文即可。 反例: “ TCP流畅超时 ” 解说成 “ 传输戒指条约流畅超时 ” ,交融反而费脑筋。

10.代码修改的共事,扫视也要进行相应的修改,预期是参数、复返值、异常、中枢逻辑等的修改。

11.扫视掉的代码尽可能而配合评释,而不是苟简的扫视掉 评释:代码被扫视掉有两种可能性:

1)后续会收复此段代码逻辑。2)长久毋庸。前者淌若莫得备注信息,难以清楚扫视动机。后者冷落径直删掉(代码仓库保存了历史代码)。

12.关于扫视的要求:

第一:大致准确反映蓄意念念想和代码逻辑;第二:大致神情业务含义,使别的要领员大致赶快了解到代码背后的信息。

十足莫得扫视的大段代码,关于阅读者形同天书,扫视是给我方看的,即使隔很万古分,也大致清亮交融那时的念念路; 扫视亦然给继任者看的,使其大致快读接替我方的作事。

13.好的定名、代码结构是自解说的,扫视骁勇精简准确,抒发到位。 幸免出现扫视的一个极点:过多滥的扫视,代码逻辑一朝修改,修改扫视是终点大的包袱。

14.特殊扫视标记,请注明标记东说念主与标记时分。 留意实时处理这些标记,通过标记扫描,常常算帐此类标记。线上故障有时候即是来源于这些标记处的代码。 1)待管事宜(TODO):(标记东说念主、标记时分,[展望处理时分])暗示需要已毕,但刻下还未已毕的功能。

五、代码表率/谈话准则 5.1 字符串数据类型 使用字符串内插来流畅短字符串,如底下的代码所示。
string displayName = $"{nameList[n].LastName}, {nameList[n].FirstName}";
若要在轮回中追加字符串,尤其是在使用大都文本时,请使用 StringBuilder 对象。
var phrase = "xiaoYxiaoYxiaoYxiaoYxiaoYxiaoY";
var manyPhrases = new StringBuilder();
for (var i = 0; i < 10000; i++)
{
    manyPhrases.Append(phrase);
}
//Console.WriteLine("tra" + manyPhrases);
5.2 隐式类型腹地变量 当变量类型显明来自赋值的右侧时,或者当精度类型不遑急时,请对腹地变量进行隐式类型化。
var var1 = "This is clearly a string.";
var var2 = 27;
当类型并非显明来自赋值的右侧时,请勿使用 var。 请勿假定类型显明来自纪律称号。 淌若变量类型为 new 运算符或显式强制搬动,则将其视为显明来自纪律称号。
int var3 = Convert.ToInt32(Console.ReadLine()); 
int var4 = ExampleClass.ResultSoFar();
请勿依靠变量称号来指定变量的类型。 它可能不正确。 在以下示例中,变量称号 inputInt 会产生误导性。 它是字符串。
var inputInt = Console.ReadLine();
Console.WriteLine(inputInt);
使用隐式类型化来详情 for 轮回中轮回变量的类型。 底下的示例在 for 语句中使用隐式类型化。
var phrase = "xiaoYxiaoYxiaoYxiaoYxiaoYxiaoY";
var manyPhrases = new StringBuilder();
for (var i = 0; i < 10000; i++)
{
    manyPhrases.Append(phrase);
}
//Console.WriteLine("tra" + manyPhrases);
不要使用隐式类型化来详情 foreach 轮回中轮回变量的类型。 在大多数情况下,联结中的元素类型并不显明。 不应仅依靠联结的称号来臆测其元素的类型。

底下的示例在 foreach 语句中使用显式类型化。

foreach (char ch in laugh)
{
    if (ch == 'h')
        Console.Write("H");
    else
        Console.Write(ch);
}
Console.WriteLine();
5.3 无标记数据类型

平方,使用 int 而非无标记类型。 int 的使用在通盘 C# 中都很常见,而况当你使用 int 时,更易于与其他库交互。

5.4 数组

当在声明行上运行化数组时,请使用马虎的语法。 在以下示例中,请留意不可使用 var 替代 string[] 。

string[] xiaoY = { "x", "i", "a", "o", "Y" };

淌若使用显式实例化,则不错使用 var。

var xiaoY = new string[] { "x", "i", "a", "o", "Y" };
5.5 寄予

在用到寄予时尽量使用 Func<> 和 Action<>,而不是自界说寄予类型。 在类中,界说寄予纪律。

	public static Action<string> ActionExample1 = x => Console.WriteLine($"x is: {x}");

	public static Action<string, string> ActionExample2 = (x, y) => 
    Console.WriteLine($"x is: {x}, y is {y}");
    
	public static Action<string> ActionExample3 = X;

	static void X(string s)
    {
		Console.WriteLine($"x is: {s}");
	}


	public static Func<string, int> FuncExample1 = x => Convert.ToInt32(x);

	public static Func<int, int, int> FuncExample2 = (x, y) => x + y;

淌若创建寄予类型的实例,请使用马虎的语法。 在类中,界说寄予类型和具有匹配签名的纪律。

public delegate void Del(string message);

public static void DelMethod(string str)
{
    Console.WriteLine("DelMethod argument: {0}", str);
}

创建寄予类型的实例,然后调用该实例。 以下声显昭示了紧缩的语法。

Del exampleDel2 = DelMethod;
exampleDel2("Hey xiaoY");

以下声明使用了齐全的语法。

Del exampleDel1 = new Del(DelMethod);
exampleDel1("Hey xiaoY");
5.6 异常处理

1.try-catch 和 using 语句正在异常处理中 在平时使用异常处理时一般都使用 try-catch 语句。咱们不错使用 using 来简化代码,简化资源的Dispose。

淌若具有 try-finally语句(该语句中 finally 块的唯一代码是对 Dispose 纪律的调用),可使用 using 语句代替。

如:

Font font1 = new Font("Arial", 10.0f);
try
{
    byte charset = font1.GdiCharSet;
}
finally
{
    if (font1 != null)
    {
        ((IDisposable)font1).Dispose();
    }
}

可使用using简化为:

using (Font font2 = new Font("Arial", 10.0f))
{
    byte charset2 = font2.GdiCharSet;
}

在C# 8中不错进一步简化:

using Font font3 = new Font("Arial", 10.0f);
byte charset3 = font3.GdiCharSet;

2.异常不要用来作念过程戒指,条目戒指。因为异常的处理成果比条目分支低。

3.大段代码进行try-catch,这是不负使命的施展。catch时请分清贯通代码合肥贯通代码,贯通代码指的是不管若何都不会出错的代码。关于费贯通代码的catch尽量可能的进行分袂异常类型,再作念对应的异常处理。

4.拿获异常是为了处理它,不要拿获了却什么都不处理而烧毁之,淌若不想处理它,就将该异常抛给他的调用者。最外层的业务使用者,必须处理异常,将其滚动为用户不错交融的内容。

5.有try块放到了事务代码中,catch异常后,淌若要回滚事务,一定要留意手动回滚事务。

6.finally块必须对资源对象、流对象进行关闭,有异常也要作念tyr-catch。

7.拿获异常与抛异常,必须是十足匹配,或者拿获异常是抛异常的父类。 评释:淌若预期对方抛的是绣球,本色接到的是铅球,就会产生恐怕情况。

8.纪律的复返值不错是null,不彊制复返空联结或空对象等,必须添加扫视充分评释什么情况下会复返null值。调用方进行null判断,谨防NRE空援用异常问题(NullReferenceException)。

5.7 && 和




Powered by 金昌路盒宜科技股份有限公司 @2013-2022 RSS地图 HTML地图

Copyright 365站群 © 2013-2022 本站首页 版权所有