当前位置: 首页 > 科技观察

编写干净的C#代码技巧

时间:2023-03-21 00:28:02 科技观察

简介在这个时代,编写代码并不困难。然而,编写干净且可扩展的代码并不容易。在本文中,我们将讨论为我们的项目编写干净的C#代码的一些技巧。乍一看,任何以前从未见过您的代码的开发人员都必须尽可能地理解它,这有助于我们更好地理解代码。以下是编写干净的C#代码的一些重要技巧。使用好的IDE首先,为您的技术栈选择最好的IDE。在我们的例子中,VisualStudio是最流行和最好的C#IDE之一。它是Microsoft的可靠、完整的产品。一些开发人员还喜欢RiderIDE(付费)。使用这些IDE可确保您的代码保持整洁。VisualStudio有一个相当稳定的intellisense功能,可以纠正和建议代码更改。用有意义的名称命名变量可能是整个软件开发生命周期中最困难的部分。为变量和方法考虑有意义的名称非常耗时。但是跳过这个过程并随机命名也不是一个好主意,是吗?不推荐使用intd表示法;这是命名变量的最简单方法,对吧?但是不要这样做。一个好的名字可以帮助其他开发人员理解变量/方法的上下文和用法。这是您要命名变量的方式。建议写作intdaysToAppalypse;使用camel/pascalcasenotation除了为变量选择合适的名称外,它还保持您编写名称的方式。理想情况下,我们使用驼峰命名法和Pascal命名法作为最佳编码实践。不要在变量中使用随机的大写字母。那只是看起来不漂亮!CamelCase基本上,变量的第一个单词的首字母将是小写的,并且每个后续单词的首字母都应该是大写的。命名局部变量和方法参数时必须使用此表示法。不推荐intRandomInteger;stringFirstName;推荐intRandomInteger;stringfirstName;Pascalcasenotation在这里,所有单词的首字母都应该大写,我们使用这种表示法来命名方法和类。不推荐写法classprogram{staticvoidmain(string[]args){Console.WriteLine("HelloWorld!");}}推荐写法classProgram{staticvoidMain(string[]args){Console.WriteLine("HelloWorld!");}}注意格式化格式化代码可以提高代码的可读性。制表符比空格好,记得吗?classProgram{staticvoidMain(string[]args){Console.WriteLine("HelloWorld!");}}这看起来怎么样?讨厌,不是吗?现在,VisualStudio有一个内置的功能来完美地格式化代码。为此,只需转到相关课程并按CTRL+K和CTRL+d,看到了吗?很酷吧?在需要时添加评论是我们所有开发人员都讨厌的事情,不是吗?但是,从长远来看,添加几行评论/描述的方法确实对您和其他开发人员有帮助。VisualStudio使它更容易,只需在相关方法上方键入///,VS将自动为您生成一个包含方法参数的注释模板。为什么这很酷?无论何时(从任何地方)调用此方法,VisualStudio都会显示您的批注。相信我,这很有帮助。附言只有在情况需要时才添加评论。例如,当特定方法过于复杂并且需要深入解释时。在这种情况下,您需要添加注释。请记住,维护注释也将成为一项任务,因此请谨慎使用它们。重用代码编写可重用代码非常重要。它减少了项目中的总代码行数并提高了效率。您不想通过多个类复制粘贴一个函数。您可以做的是创建一个共享库项目并在每个需要的项目中引用它。通过这种方式,我们构建了可重用的函数。而且,如果需要任何修改,您只需更改共享库中的代码,而不是在任何地方。保持类尽可能小根据Solid原则,您必须将类隔离成只有一个职责功能的小块。这有助于我们实现松散耦合的代码。确保您在查看课程时不需要反复滚动。这可以是一般的经验法则。使用设计模式这可能是架构师级别的开发人员需要做的事情。确定将哪种设计模式应用于哪种场景需要大量经验。设计模式基本上是能够在构建解决方案时提供可重用解决方案的模式。组织您的解决方案您是否构建结构化解决方案?构建这样一个系统是非常令人满意和重要的。下面是我遵循洋葱架构的解决方案。所有工作仍然可以在一个项目中完成。然而,为了支持可扩展性和松散耦合的解决方案,我们将它们分成不同的层,例如应用程序、域、基础设施等。这里还有一些其他优点:可重用性——如果您想将同一个项目用于另一个解决方案,您可以。改进的安全性高度可维护的可扩展控制反转等避免魔术字符串/数字什么是魔术字符串?它们是直接在应用程序代码中指定的字符串,对应用程序的行为有直接影响。也就是说,不要在你的应用程序中使用硬编码的字符串或值。随着应用程序的增长,跟踪这些字符串可能会很困难。此外,这些字符串可以与某种外部引用相关联,如文件名、文件路径、URL等。在这种情况下,当资源位置发生变化时,必须更新所有这些魔术字符串,否则应用程序将崩溃。考虑以下示例:if(userRole=="Admin"){//logichere}您可以编写:conststringADMIN_ROLE="Admin"if(userRole==ADMIN_ROLE){//logichere}或者,您也可以创建Enum并简单地使用它。这是一种更简洁的代码编写方式。移除未使用的代码通常有注释掉未使用代码的做法,最终会增加应用程序编译时的代码行数。你不应该这样做。您可以使用Git等源代码管理来确保您可以随时恢复。宁愿使用Git而不是注释掉代码。使用方法链接这是Microsoft在默认生成的代码中广泛使用的一种常见技术。在这里,每个方法都返回一个对象,这些函数将链接在一起。认出?这是方法链的一个很好的例子。services.AddHealthChecks().AddSqlServer(_configuration.GetConnectionString("DefaultConnection"));下面是一个详细的例子。我们有一个学生类和另一个创建并返回数据以填充学生对象的随机方法。publicclassStudent{publicstringName{get;set;}publicintAge{get;set;}}publicStudentSomeMethod(){StudenttestStudent=newStudent();testStudent.Name="JayKrishnaReddy";testStudent.Age=25;returntestStudent;}对于我们开发者来说,设置Student对象的值可能不是问题。但是假设单元测试开发人员必须对您的类进行测试并且实际上没有C#,或者您希望通过简化整个过程来取悦您的客户。这就是Fluent接口发挥作用的地方。创建一个新的Fluent类,如下所示:;}}publicStudentFluentSomeMethod(){returnnewStudentFluent().AddName("JayKrishnaReddy").AddAge(25);}这是有道理的,并且在一个全新的水平上提高了可读性,对吧?方法链的另一个简单示例如下:string.Empty);}使用async/awaitasync编程是必经之路!在处理需要一些时间才能完成计算的函数时,异步编程有助于提高整体效率。在执行此类功能期间,对于最终用户而言,整个应用程序似乎被冻结了。这会导致糟糕的用户体验。在这种情况下,我们使用异步方法来释放主线程。不要在catch块中使用Throwex你真的不希望在你捕获异常后就“throwex”并丢失堆栈跟踪数据。就用“扔”吧。通过使用此方法,您还可以存储堆栈跟踪,这对诊断很重要。不建议写try{//Dosomething..}catch(Exceptionex){throwex;}建议写try{//Dosomething..}catch(Exceptionex){throw;}使用三元运算符考虑以下举个例子,我相信你很多人仍然遵循这种做法。publicstringSomeMethod(intvalue){if(value==10){return"Valueis10";}else{return"Valueisnot10";}}但如果有更好更简洁的方法呢?介绍三元运算符。现在我们之前写的多行代码可以使用三元运算符缩减为一行,你可以开始想象这将节省多少行代码!publicstringSomeMethod(intvalue){returnvalue==10?"Valueis10":"Valueisnot10";}使用Null合并运算符类似地,我们还有另一个运算符可以在执行空值检查时派上用场。??此运算符在C#中称为Null合并运算符。考虑另一个例子,下面是一个接受Student对象作为参数并检查空对象的小函数。如果为空,则返回一个包含数据的新对象,否则返回相同的对象。publicStudentSomeMethod(Studentstudent){if(student!=null){returnstudent;}else{returnnewStudent(){Name="JayKrishnaReddy"};}}让我们添加运算符并缩小这个函数!publicStudentSomeMethod(Studentstudent){returnstudent??newStudent(){Name="JayKrishnaReddy"};}PreferredStringInterpolation每次要给字符串添加动态值时,我们倾向于使用复合格式或者只使用加号。publicstringSomeMethod(Studentstudent){return"StudentNameis"+student.Name+".Ageis"+student.Age;}从C#6开始,引入了字符串插值函数。这提供了一种更具可读性和更酷的语法来创建格式化字符串。下面是如何使用内插字符串。publicstringSomeMethod(Studentstudent){return$"StudentNameis{student.Name}.Ageis{student.Age}";}使用表达式体方法该方法用于方法体比方法定义本身还要小得多的场景。为什么要浪费括号和代码行?下面介绍如何编写表达式主体方法。publicstringMessage()=>"HelloWorld!";避免太多的参数太多的参数总是一场噩梦。如果您倾向于向任何方法输入3个以上的参数,为什么不将其包装到请求对象或其他对象中并传递呢?让我们看一个小例子。publicStudentSomeMethod(stringname,stringcity,intage,stringsection,DateTimedateOfBirth){returnnewStudent(){Age=age,Name=name,//Otherparameterstoo};}你可能希望它是这样的。publicStudentSomeMethod(Studentstudent){returnstudent;}不要忽略捕获的错误这就是我一直在做的。你们中的许多人很有可能会这样做。我们添加了一个try-catch块并忽略了错误处理,对吗?处理此类错误并将它们记录到表或磁盘中是一种很好的做法。publicvoidSomeMethod(){try{DoSomething();}catch{}}publicvoidSomeMethod(){try{DoSomething();}catch(Exceptionex){LogItSomewhere(ex);}}