【.NET Core】常见C#代码约定

【.NET Core】常见C#代码约定

文章目录

  • 【.NET Core】常见C#代码约定
    • 一、概述
    • 二、代码预定的目标
    • 三、代码约束工具和分析器
    • 四、C#语言准则
    • 五、字符串约定
      • 5.1 使用字符串内插来连接短字符串
      • 5.2 插入大文本时,使用`System.Text.StringBuilder`对象
    • 六、数组约定
    • 七、委托约定
      • 7.1 使用`Func<>`和`Action<>`,而不是定义委托类型
      • 7.2 使用`Func<>`和`Action<>`委托定义的签名来调用方法
      • 7.3 如果创建委托类型的实例,请使用简洁的语法
      • 7.4 创建委托类型的实例,然后调用该实例
    • 八、`&&` 和 `||` 运算符
      • 8.1 在执行比较时,使用`&&` 而不是 `&`,使用`||`而不是`|`
    • 九、new运算符
      • 9.1 使用对象实例化的简洁形式
      • 9.2 使用对象初始值设定项简化对象创建
    • 十、静态成员
    • 十一、`LINQ`查询
      • 11.1 对查询变量使用有意义的名称
      • 11.2 使用别名确保匿名类型的属性名称都使用 Pascal 大小写格式正确大写
      • 11.3 如果结果中的属性名称模棱两可,请对属性重命名
      • 11.4 在查询变量和范围变量的声明中使用隐式类型化
      • 11.5 对齐`from`子句下的查询子句,其他查询子句前面使用`where`子句,确保后面的查询子句作用于作用于经过缩减和筛选的一组数据
      • 11.6 使用多行 `from` 子句代替`join`子句来访问内部集合
    • 十二、隐式类型本地变量
      • 12.1 当变量的类型在赋值右侧比较明显时,对局部变量使用隐式类型
      • 12.2 当类型在赋值右侧不明显时,请勿使用`var`
      • 12.3 不要使用变量名称指定变量的类型
      • 12.4 避免使用`var`来替代`dynamic`
      • 12.5 在for循环中对循环变量使用隐式类型
      • 12.6 不要使用隐式类型在foreach循环中类型
      • 12.7 对 LINQ 查询中的结果序列使用隐式类型
    • 十三、注释样式

在这里插入图片描述

一、概述

代码标准对于在开发团队中维护代码可读性、一致性和协作至关重要。 遵循行业实践和既定准则的代码更易于理解、维护和扩展。 大多数项目通过代码约定强制要求样式一致。本文我们将讨论编码约定和用于强制实施这些约定的工具。

二、代码预定的目标

  • 正确性

在编辑代码时,需要代码具有复原能力且正确无误,即使在多次编辑之后也是如此。

  • 一致性

在编写代码中,我们需要遵循相同的规则,使之在整个项目周期中遵循相同的规则样式。

三、代码约束工具和分析器

工具可帮助团队强制实施标准。可以启用代码分析来强制实施代码规则。可以创建editorconfig,以便Visual Studio可自动强制实施样式标准。

借助这些工具,团队可以更轻松地采用首选的标准。Visual Studio将在范围中的所有.editorconfig文件中应用规则,以设置代码的格式。可以使用多个配置来强制实施企业范围的标准、团队标准甚至精细的项目标准。

启用的规则被违反时,代码分析会生成警告和诊断。可以配置想要应用于项目的规则。然后,每个CI生成会在违反任何规则时通知开发人员。

四、C#语言准则

一般情况C#需要遵从以下准则:

  • 尽可能利用新式语言功能和 C# 版本
  • 避免陈旧或过时的语言构造
  • 仅捕获可以正确处理的异常;避免捕获泛型异常
  • 使用特定的异常类型提供有意义的错误消息
  • 使用 LINQ 查询和方法进行集合操作,以提高代码可读性
  • 将异步编程与异步和等待用于 I/O 绑定操作
  • 谨慎处理死锁状态,并在适当时使用Task.ConfigureAwait
  • 对数据类型而不是运行时类型使用语言关键字。例如:定义字符串使用string而不是System.String,或使用int而不是System.Int32
  • 使用 int 而不是无符号类型。 int 的使用在整个 C# 中很常见,并且当你使用 int 时,更易于与其他库交互。 特定于无符号数据类型的文档例外
  • 仅当读者可以从表达式推断类型时使用 var
  • 以简洁明晰的方式编写代码
  • 避免过于复杂和费解的代码逻辑

五、字符串约定

5.1 使用字符串内插来连接短字符串

string displayName = $"{JsonList[n].LastName}, {JsonList[n].FirstName}";

5.2 插入大文本时,使用System.Text.StringBuilder对象

var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala";
var manyPhrases = new StringBuilder();
for (var i = 0; i < 10000; i++)
{manyPhrases.Append(phrase);
}
var response = stringBuilder.ToString();

六、数组约定

  • 当在声明行上初始化数组时,请使用简洁的语法
string[] vowels1 = { "H", "O", "O", "L", "G" };
  • 如果使用显式实例化,则可以使用 var
var word=new String[]{"G","O","Y","E","E","R"};

七、委托约定

7.1 使用Func<>Action<>,而不是定义委托类型

Action<string> actionExample1 = x => Console.WriteLine($"x is: {x}");
Action<string, string> actionExample2 = (x, y) =>Console.WriteLine($"x is: {x}, y is {y}");
Func<string, int> funcExample1 = x => Convert.ToInt32(x);
Func<int, int, int> funcExample2 = (x, y) => x + y;

7.2 使用Func<>Action<>委托定义的签名来调用方法

actionExample1("string for x");
actionExample2("string for x", "string for y");
Console.WriteLine($"The value is {funcExample1("1")}");
Console.WriteLine($"The sum is {funcExample2(1, 2)}");

7.3 如果创建委托类型的实例,请使用简洁的语法

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

7.4 创建委托类型的实例,然后调用该实例

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

八、&&|| 运算符

8.1 在执行比较时,使用&& 而不是 &,使用||而不是|

Console.Write("Enter a dividend: ");
int dividend = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter a divisor: ");
int divisor = Convert.ToInt32(Console.ReadLine());
if ((divisor != 0) && (dividend / divisor) is var result)
{Console.WriteLine("Quotient: {0}", result);
}
else
{Console.WriteLine("Attempted division by 0 ends up here.");
}

九、new运算符

9.1 使用对象实例化的简洁形式

var firstExample = new ExampleClass();
ExampleClass instance2 = new();

前面的声明等效于下面的声明:

ExampleClass secondExample = new ExampleClass();

9.2 使用对象初始值设定项简化对象创建

var thirdExample = new ExampleClass { Name = "Desktop", ID = 37414,Location = "Redmond", Age = 2.3 };

十、静态成员

使用类名调用static成员:ClassName.StaticMember。通过明确静态访问使代码更易于阅读。请勿使用派生类的名称来限定基类中定义的静态成员。编译代码时,代码可读性具有误导性,如果向派生类添加具有相同名称的静态成员,代码可能会被破坏。

十一、LINQ查询

11.1 对查询变量使用有意义的名称

var seattleCustomers = from customer in customerswhere customer.City == "Seattle"select customer.Name;

11.2 使用别名确保匿名类型的属性名称都使用 Pascal 大小写格式正确大写

var localDistributors =from customer in customersjoin distributor in distributors on customer.City equals distributor.Cityselect new { Customer = customer, Distributor = distributor };

11.3 如果结果中的属性名称模棱两可,请对属性重命名

var localDistributors2 =from customer in customersjoin distributor in distributors on customer.City equals distributor.Cityselect new { CustomerName = customer.Name, DistributorID = distributor.ID };

11.4 在查询变量和范围变量的声明中使用隐式类型化

var seattleCustomers = from customer in customerswhere customer.City == "Seattle"select customer.Name;

11.5 对齐from子句下的查询子句,其他查询子句前面使用where子句,确保后面的查询子句作用于作用于经过缩减和筛选的一组数据

var seattleCustomers2 = from customer in customerswhere customer.City == "Seattle"orderby customer.Nameselect customer;

11.6 使用多行 from 子句代替join子句来访问内部集合

var scoreQuery = from student in studentsfrom score in student.Scores!where score > 90select new { Last = student.LastName, score };

十二、隐式类型本地变量

12.1 当变量的类型在赋值右侧比较明显时,对局部变量使用隐式类型

var message = "This is clearly a string.";
var currentTemperature = 27;

12.2 当类型在赋值右侧不明显时,请勿使用var

int numberOfIterations = Convert.ToInt32(Console.ReadLine());
int currentMaximum = ExampleClass.ResultSoFar();

12.3 不要使用变量名称指定变量的类型

12.4 避免使用var来替代dynamic

如果想要进行运行时类型推理,请使用 dynamic

12.5 在for循环中对循环变量使用隐式类型

var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala";
var manyPhrases = new StringBuilder();
for (var i = 0; i < 10000; i++)
{manyPhrases.Append(phrase);
}

12.6 不要使用隐式类型在foreach循环中类型

不要使用隐式类型化来确定 foreach循环中循环变量的类型。 在大多数情况下,集合中的元素类型并不明显。 不应仅依靠集合的名称来推断其元素的类型。

12.7 对 LINQ 查询中的结果序列使用隐式类型

关于LINQ的部分说明了许多LINQ查询会导致必须使用隐式类型的匿名类型。其他查询则会产生嵌套泛型类型,其中var的可读性更高。

十三、注释样式

  • 使用单行注释(//)以进行简要说明
  • 避免使用多行注释(/* */)来进行较长的解释。 注释不进行本地化处理。 相反,配套文章中提供了较长的解释
  • 若要描述方法、类、字段和所有公共成员,请使用XML注释
  • 将注释放在单独的行上,而非代码行的末尾
  • 以大写字母开始注释文本
  • 以句点结束注释文本
  • 在注释分隔符 (//) 与注释文本之间插入一个空格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php数组运算符 比较 isset、is_null、empty的用法和区别

php数组运算符 1. 数组运算符2. 判断两个数组是否相等3. isset、is_null、empty的用法和区别 1. 数组运算符 注意&#xff1a;只会保留第一个数组中的键值对&#xff0c;而忽略后面数组中相同键名的元素&#xff0c;如果想要合并两个数组并覆盖相同键名的元素&#xff0c;可以…

C与C++的性能差距来源于哪里?

C与C的性能差距来源于哪里&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xf…

SpringBoot图书管理系统

介绍 图书管理系统助力于图书馆中图书的管理&#xff0c;功能包含图书管理、借阅、归还&#xff0c;三块业务的解决方案&#xff0c;可对图书进行查询、查询图书剩余数量及借阅记录和状态、监控数量不足的图书。 使用技术 SpringBootMyBatisThymeleafMySQL 项目结构 业务流…

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOAHA 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff…

体验一下UE5.3的Skeletal Editor

UE5.3中增加了蒙皮网格骨架编辑工具&#xff0c;用户无需导出Fbx就可以直接编辑蒙皮网格&#xff0c;支持修改绑定姿势的骨骼位置、修改蒙皮权重、对已蒙皮多边形进行编辑以及对蒙皮网格减免等操作&#xff0c;就来体验一下。 1.加载插件 要使用Skeletal Editor功能&#xff…

SpringBoot中使用PageHelper插件实现Mybatis分页

场景 SpringBoot中整合Mybatis时一般添加的依赖为 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version></dependency> 如果要实现分页查…

PostgreSQL里实现计算多个数字的排列组合

在进行排列组合的时候&#xff0c;每一次需要知道是否有重复的值&#xff0c;并过滤出已经排列过的值。这个可以创建支持可变参数的函数来实现。下边的函数用到了聚合判断&#xff0c;并且可变参数使用variadic标记的数组。 postgres<16.1>(ConnAs[postgres]:PID[188277…

基于shp数据制作3DTiles建筑白膜

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网、建筑三维模型&#xff0c;输出标准3DTiles服务、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析。欢迎下载试用&#xff1a;http://www.magic3d.…

二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的 对于以month、year为分区字段的数据&#xff0c;不是像day字段分区那样每天增量插入更新即可&#xff0c;而是要以部分字段查询、部分字段更新&#xff0c;但是ClickHouse数据库并不适合更新操作&#xff0c;直接使用Kettle的插入更新控件会导致问题&#xff0c;必须…

Java项目,营销抽奖系统设计实现

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 项目&#xff1a;https://gaga.plus 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主&#xff0c;小傅哥。 经过这个假期的嘎嘎卷&#x1f9e8;…

软件实际应用实例分享,门诊电子处方模板制作教程,中西医诊所病历开单系统教程

软件实际应用实例分享&#xff0c;门诊电子处方模板制作教程&#xff0c;中西医诊所病历开单系统教程 一、前言 以下软件教程以 佳易王诊所电子处方软件V17.3为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、在开电子处方的时候&#xff0c…

相机图像质量研究(40)常见问题总结:显示器对成像的影响--画面泛白

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

阿里云幻兽帕鲁Windows 服务器怎么下载存档?

阿里云幻兽帕鲁Windows 服务器怎么下载存档&#xff1f;通过远程连接window服务器桌面的方式。 远程连接到阿里云的 Windows 服务器后&#xff0c;可以将压缩后的存档文件&#xff0c;拖动到 workbench\Download 目录后&#xff0c;就会触发浏览器的文件下载&#xff0c;然后将…

[职场] 预算员简历模板 #媒体#微信#笔记

预算员简历模板 个人简历 基本资料 姓名&#xff1a;蓝小小 性别&#xff1a;男 年龄&#xff1a;28岁 籍贯&#xff1a;重庆 现居地址&#xff1a;重庆渝中区 政治面貌&#xff1a;中共党员 婚姻状况&#xff1a;已婚 求职意向 意向岗位&#xff1a;预算员 期望薪…

notepad++的下载与使用

1.进入官网下载 https://notepad-plus-plus.org/ 点击下载即可 2.选择中文简体 3.建议安装在D盘 其余步骤按照指示就行 4.安装后这几个是必选的 设置完成后就可以写中文了 以此为例 结果为

mysql mgr集群部署

一、前言 mysql mgr集群是为了实现mysql高可用&#xff0c;分为单主集群和多主集群&#xff0c;单主集群只有一个主节点可写&#xff0c;节点发生故障时&#xff0c;自动进行主从的故障切换&#xff0c;多主集群所有节点都可写&#xff0c;当节点发生故障时&#xff0c;将故障节…

如何在iStoreOS软路由系统中安装cpolar实现公网远程本地电脑桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

Python算法100例-1.8 冒泡排序

完整源代码项目地址&#xff0c;关注博主私信’源代码’后可获取 1.问题描述2.问题分析3.算法设计4.完整的程序5.问题拓展 1&#xff0e;问题描述 对N个整数&#xff08;数据由键盘输入&#xff09;进行升序排列。 2&#xff0e;问题分析 对于N个类型相同的数&#xff0c;…

【Node.js】path 模块进行路径处理

Node.js 执行 JS 代码时&#xff0c;代码中的路径都是以终端所在文件夹出发查找相对路径&#xff0c;而不是以我们认为的从代码本身出发&#xff0c;会遇到问题&#xff0c;所以在 Node.js 要执行的代码中&#xff0c;访问其他文件&#xff0c;建议使用绝对路径 实例&#xff1…

040 构造器详解

无参构造器 当一个类未定义任何构造器时&#xff0c;代码编译后会自动生成一个无参构造器&#xff0c;如果只需要无参构造器就可以直接省略定义。 public class Person {public Person(){}String name;int age; }public class Person {String name;int age; }有参构造器 有参…