前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >编写干净的C#代码技巧

编写干净的C#代码技巧

作者头像
郑子铭
发布于 2023-10-23 06:08:35
发布于 2023-10-23 06:08:35
26810
代码可运行
举报
运行总次数:0
代码可运行

介绍

在当今时代,编写代码并不困难。然而,编写干净且可伸缩的代码并不容易。在本文中,我们将讨论一些为我们的项目编写干净C#代码的技巧。乍一看,任何以前从未见过您的代码的开发人员都必须尽可能地理解它,它帮助我们更好地理解代码。

下面是编写干净C#代码的一些重要技巧。

使用好的IDE

首先,为您的技术堆栈选择最好的IDE。在我们的例子中,Visual Studio是C#最流行、最好的IDE之一。它是微软可靠的、完全的产品。一些开发人员也喜欢Rider IDE(付费)。使用这些IDE可以确保代码保持整洁。Visual Studio有相当稳定的智能感知特性,可以纠正和建议代码中的更改。

使用有意义的名字

命名变量可能是整个软件开发生命周期中最困难的部分。为变量和方法想一个有意义的名称是非常耗时的。但是跳过这个过程并随机命名也不是一个好主意,不是吗?

不建议写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int d;

这是命名变量最简单的方法,对吧?但是不要这样做。一个好的名称可以帮助其他开发人员理解变量/方法的上下文和用法。下面是您想要命名变量的方式。

建议写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int daysToAppocalypse;

使用骆驼/帕斯卡大小写符号

除了为变量选择一个合适的名称外,还要维护您编写名称的方式。理想情况下,我们使用骆驼大小写和Pascal大小写表示法作为最佳代码实践。不要在变量中使用随机大写字母。那看起来就是不漂亮!

驼峰式大小写符号

基本上,变量的第一个单词的第一个字母将是小写的,后面每一个单词的第一个字母应该是大写的。在命名局部变量和方法参数时,必须使用这种符号。

不建议写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int RandomInteger; 
string FirstName; 

建议写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int randomInteger;   
string firstName;

帕斯卡案例符号

这里,您所有单词的首字母应该是大写,我们使用这种符号来命名方法和类。

不建议写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class program  
{ 
      static void main(string[] args)    
         {         
           Console.WriteLine("Hello World!");   
              
         }  
               
  }

建议写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program   
{       
  static void Main(string[] args)      
   {           
   Console.WriteLine("Hello World!");       
   }   
 }

注意格式

对代码进行格式化可以提高代码的可读性。制表符优于空格,记得吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program   
{
  static void Main(string[] args)      
   {
   Console.WriteLine("Hello World!");      
    }   
  }

这个看起来怎么样?很讨厌,是吗?现在,Visual Studio有一个内置特性,可以完美地格式化代码。要做到这一点,只需到相关的类中按CTRL + K和CTRL + d,看到了吗?很酷,是吗?

在需要的时候添加注释

这是我们所有开发人员都讨厌的事情,不是吗?然而,从长远来看,添加几行评论/描述的方法确实能帮助你和其他开发人员。Visual Studio使它变得更加容易,只要在相关的方法上面输入///,VS就会自动为您生成一个包含方法参数的注释模板。

为什么这么酷?无论何时(从任何地方)调用这个方法,Visual Studio都会显示您的注释。相信我,这很有帮助。

P.S. 只有在情况需要的时候才添加评论。例如,当某个特定方法过于复杂,需要深入解释时。在这种情况下,您需要添加注释。记住,维护注释也将成为一项任务,因此要有节制地使用注释。

重用代码

编写可重用的代码是非常重要的。它可以减少项目中的总代码行数,并提高效率。您不希望通过多个类复制粘贴一个函数。相反,您可以做的是创建一个共享库项目,并在每个必需的项目中引用它。通过这种方式,我们构建了可重用的函数。而且,如果需要进行任何修改,您只需要更改共享库中的代码,而不是在任何地方更改。

保持类尽可能小

根据Solid原则,您必须将类隔离为只有一个职责函数的小块。这有助于我们实现松散耦合的代码。确保您在查看类时不需要反复滚动。这可以是一个一般的经验法则。

使用设计模式

这可能是架构师级别的开发人员需要做的事情。确定将哪种设计模式应用于哪种场景需要大量的经验。设计模式基本上是能够在架构解决方案时提供可重用解决方案的模式。

把您的解决方案组织好

你构建结构化的解决方案吗?建立一个这样的系统是非常令人满意和重要的。下面是我遵循洋葱架构的一个解决方案。

在单个项目中仍然可以完成所有工作。但是,为了支持可伸缩性和松散耦合的解决方案,我们将它们分成不同的层,如应用程序、领域、基础设施等。

这里还有一些其他的优势:

  • 可重用性——如果您想将同一个项目用于另一个解决方案,您可以这样做。
  • 改进的安全性
  • 高度可维护的
  • 可伸缩的
  • 控制反转等

避免魔法字符串/数字

什么是魔法字符串?它们是直接在应用程序代码中指定的字符串,对应用程序的行为有直接影响。换句话说,不要在应用程序中使用硬编码的字符串或值。当应用程序增长时,跟踪这些字符串是很困难的。此外,这些字符串可以与某种外部引用相关联,如文件名、文件路径、URL等。在这种情况下,当资源的位置发生变化时,必须更新所有这些神奇的字符串,否则应用程序将中断。考虑下面的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(userRole == "Admin")  
 {      
  //logic here  
   }

你可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const string ADMIN_ROLE = "Admin"   
if(userRole == ADMIN_ROLE )  
 {     
   //logic here  
  }

或者,您也可以为用户角色创建枚举并简单地使用它。这是一种更简洁的编写代码的方式。

删除未使用的代码

通常会有注释掉未使用代码的做法,这最终会增加应用程序编译时的代码行数。你不应该这样做。您可以使用像Git这样的源控件来确保您可以在任何时候恢复。宁愿使用Git而不是注释掉代码。

使用方法链接

这是Microsoft在默认生成代码中广泛使用的一种常见技术。在这里,每个方法返回一个对象,这些函数将被链接在一起。认识吗?这是方法链接的一个很好的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddHealthChecks().AddSqlServer(_configuration.GetConnectionString("DefaultConnection"));

下面是一个详细的例子。我们有一个student类和另一个创建并返回数据填充student对象的随机方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Student   

{   

    public string Name { get; set; }   

    public int Age { get; set; }   

}   

public Student SomeMethod()   

{   

    Student testStudent = new Student();   

    testStudent.Name = "Jay Krishna Reddy";   

    testStudent.Age = 25;   

    return testStudent;   

}

对我们开发人员来说,设置Student对象的值可能不是问题。但是,让我们假设一个单元测试开发人员必须在您的类上进行测试,并且实际上没有C#,或者您想通过简化整个过程来取悦您的客户。这就是连贯接口的用武之地。创建一个新的连贯类,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StudentFluent   

{   

    private Student student = new Student();   

    public StudentFluent AddName(string name)   

    {   

        student.Name = name;   

        return this;   

    }   

    public StudentFluent AddAge(int age)   

    {   

        student.Age = age;   

        return this;   

    }   

}   

public StudentFluent SomeMethod()   

{   

    return new StudentFluent().AddName("Jay Krishna Reddy").AddAge(25);   

}

这很有意义,并且在一个全新的层次上提高了可读性,对吗?方法链接的另一个简单例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public string AnotherMethod()   

{   

    string name = "Jay Krishna";   

    return name.Replace("J", "A").Replace("A", "J").Replace(".", string.Empty);   

}

使用异步/等待

异步编程是最好的选择!异步编程在处理需要一些时间才能完成计算的函数时,有助于提高总体效率。在这样的函数执行期间,对于最终用户来说,整个应用程序似乎是冻结的。这导致了糟糕的用户体验。在这种情况下,我们使用异步方法来释放主线程。

不要在catch块使用Throw ex

您确实不希望只是在捕获异常并丢失堆栈跟踪数据后对其进行“throw ex”。只需使用“throw”即可。通过使用此方法,您还可以存储堆栈跟踪,这对于诊断很重要。

不建议写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try   

{   

    // Do something..   

}   

catch (Exception ex)   

{   

    throw ex;   

}

建议写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

try   

{   

    // Do something..   

}   

catch (Exception ex)   

{   

    throw;   

}

使用三元运算符

考虑下面的例子,我相信你们很多人仍然在遵循这一做法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public string SomeMethod(int value)   

{   

    if(value == 10)   

    {   

        return "Value is 10";   

    }   

    else   

    {   

        return "Value is not 10";   

    }   

} 

但如果有更好更清洁的方法呢?引入三元操作符。

现在我们之前写的多行代码可以使用三元运算符缩减为一行,您可以开始想象这将节省多少行代码!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public string SomeMethod(int value)   

{   

    return value == 10 ? "Value is 10" : "Value is not 10";   

}  

使用Null合并操作符

类似地,我们还有另一个操作符,可以在进行null检查时派上用场。??这个操作符在C#中称为Null合并操作符。

考虑另一个例子,下面是一个接受Student对象作为参数并检查空对象的小函数。如果为空,返回一个带有数据的新对象,否则返回相同的对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Student SomeMethod(Student student)   

{   

    if (student != null)   

    {   

        return student;   

    }   

    else   

    {   

        return new Student() { Name = "Jay Krishna Reddy" };   

    }   

}   

让我们添加操作符并缩小这个函数!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Student SomeMethod(Student student)   

{   

    return student ?? new Student() { Name = "Jay Krishna Reddy" };   

}  

首选字符串插值

每次您要向字符串添加动态值时,我们都倾向于使用复合格式或仅使用加号将其添加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public string SomeMethod(Student student)   

{   

    return "Student Name is " + student.Name + ". Age is " + student.Age;   

}  

从C# 6开始,引入了String Interpolation功能。这提供了一种更具可读性和凉爽性的语法来创建格式化的字符串。这是使用内插字符串的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

  public string SomeMethod(Student student)   

{   

    return $"Student Name is {student.Name}. Age is {student.Age}";   

} 

使用表达体法

这样的方法用于方法体甚至比方法定义本身小得多的场景中。为什么要浪费括号和代码行呢?下面是编写表达式体方法的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public string Message() => "Hello World!";  

避免太多参数

太多的参数总是一场噩梦。如果你倾向于有超过3个参数输入到任何方法,为什么不把它包装到一个请求对象或其他东西,然后传递?让我们看一个小例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Student SomeMethod(string name, string city, int age, string section, DateTime dateOfBirth)   

{   

    return new Student()   

        Age = age,   

        Name = name,   

        //Other parameters too   

    };   

}   

你可能希望它是这样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public Student SomeMethod(Student student)   

{   

    return student;   

}    

不要忽略捕捉到的错误

这是我一直在做的事情。你们很多人很有可能也会这样做。我们添加了一个try-catch块并忽略了错误处理,对吗?处理此类错误并将其记录到表或磁盘是一种很好的实践。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void SomeMethod()   

{   

    try   

    {   

        DoSomething();   

    }   

    catch   

    {   

   

    }   

}   

public void SomeMethod()   

{   

    try   

    {   

        DoSomething();   

    }   

    catch (Exception ex)   

    {   

        LogItSomewhere(ex);   

    }   

}   
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
学习
学习
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
详解C# 序列化和反序列化
今天我利用这篇文章给大家讲解一下 C# 中的序列化与反序列化。这两个概念我们在开发中经常用到,但是我们绝大部分只用到了其中的一部分,剩下的部分很多开发人员并不清楚,伸着可以说是不知道。因此我希望通过这篇文章能让各位对序列化和反序列化的知识有更进一步的掌握。废话不多说开始进入正题。
喵叔
2020/09/08
4.4K0
详解C# 序列化和反序列化
【深入浅出C#】章节 9: C#高级主题:LINQ查询和表达式
C#高级主题涉及到更复杂、更灵活的编程概念和技术,能够让开发者更好地应对现代软件开发中的挑战。其中,LINQ查询和表达式是C#高级主题中的一项关键内容,具有以下重要性和优势:
喵叔
2023/08/21
2.5K0
[C#] 走进 LINQ 的世界
    技巧:《Linq To Objects – 如何操作字符串》 和 《Linq To Objects – 如何操作文件目录》
全栈程序员站长
2022/09/06
4.7K0
[C#] 走进 LINQ 的世界
(五) SpringBoot起飞之路-Thymeleaf模板引擎整合及基本用法总结
现在来说,前后端分离开始更加流行,但是很多旧的项目,或者自己一个人写东西,我感觉使用模板引擎也是非常不错的选择,还有时候去找一些后台的开源模板,有一些也都用了Thymeleaf, 何况出于学习的态度,学哪种技术都是可以的
BWH_Steven
2020/05/31
2.1K0
深入.NET平台和C#编程
1-1:Microsoft.NET框架概述 a.Microsoft.NET介绍 .NET的战略目标是在任何时候(when),任何地方(where)任何工具(what)都能通过.NET的服务获得网络上的任何信息, 享受网络给人们的便捷与快乐. b..NET框架的特点 (1)它是.NET框架类库中一个重要的组成部分 (2).NET框架为我们提供了大量的类库,它是一个巨大的宝藏,.NET应用程序可以使用这些类库进行开发 (3)Visual Studio开发工具也可以使用VB.NET语言开发程序 (4).NET框架支持跨语言开发,只要是.NET框架支持的语言都可以实现相互调用和协作 c..NET框架概述 .NET框架非常强大,主要体现在以下几种: (1)提供了一个面向对象的环境变量,完全支持面向对象编程.提高软件的可复用性、可扩展性、可维护性、灵活性等。 (2)对Web应用的强大支持,如今是互联网的时代,大量的网络应用程序发挥着重要的作用。请查看:www.dell.com (3)对Web Server(Web)的支持,WebServer是.NET非常重要的内容。Hotmail和MSN登录时都要使用Hotmail的账户... (4)Visual Studio是一个世界级的开发工具,它和.NET框架配合,能够方便快捷地开发出多种.NET应用程序, 还可以进行测试、版本控制、Team开发和部署等。 1-2:.NET框架结构 a..框架结构 详细请看P11页 例如: .NET Framework .NET Framework类库 Web窗体 Web Service WinForms ASP.NET ADO.NET和XML类 基本框架类 CLR CLS CTS 如上所示:框架结构中的组件
用户1112962
2018/09/27
1.9K0
【C# 基础精讲】LINQ 基础
LINQ(Language Integrated Query)是一项强大的C#语言特性,它使数据查询和操作变得更加简洁、灵活和可读性强。通过使用LINQ,您可以使用类似SQL的语法来查询各种数据源,如集合、数组、数据库等。本文将介绍LINQ的基础概念、常见的LINQ操作和示例,以及如何在C#中利用LINQ进行数据查询和处理。
繁依Fanyi
2023/10/12
3520
【C# 基础精讲】LINQ 基础
Java常用API
编写一个机器人程序去控制机器人踢足球,程序就需要向机器人发出向前跑、向后跑、射门、抢球等各种命令,没有编过程序的人很难想象这样的程序如何编写。但是对于有经验的开发人员来说,知道机器人厂商一定会提供一些用于控制机器人的Java类,这些类中定义好了操作机器人各种动作的方法。其实,这些Java类就是机器人厂商提供给应用程序编程的接口,大家把这些类称为Xxx Robot API。本章涉及的Java API指的就是JDK中提供的各种功能的Java类。
闲花手札
2021/08/24
1.1K0
C# 编程中非常有用的 12 个快捷方式
无论你是初学者还是经验丰富的 C# 开发人员,掌握快捷键都能极大地加快编码速度并提高效率。
郑子铭
2025/02/25
870
C# 编程中非常有用的 12 个快捷方式
编程中老生常谈的【编码规范】你还记得多少?进来回顾一下吧【文末送书】
  如果没有编码规范,团队中的每个人都按自己的编码风格来。在不久的将来,维护和调试代码将变得不容易。
呆呆敲代码的小Y
2022/11/20
8870
编程中老生常谈的【编码规范】你还记得多少?进来回顾一下吧【文末送书】
精:C#历来版本特性一览
使用 C# 作为开发语言已经 15 个年头了,受惠于 C# 的不断更新,伴随着大量的新特性与大量语法糖,让我更加容易写出简洁、高效的代码。日常中大量特性早已信手拈来,当然从未尝试过的特性更是难以尽数,但是每每回忆代码中的特性究竟是哪个版本引入的,却颇为含糊。索性简单整理记录下来,用以备忘,进而能够更精确地根据想使用的特性确定程序需要的 Framework 版本。 尽管参考了微软的官方文档,但所列特性难免基于我所接触使用到的狭隘范围,用中括号附上短评(如【我是短评】),用以提示,希望不至于画蛇添足吧。
郑子铭
2023/08/30
2430
精:C#历来版本特性一览
C# 规范整理·语言要素
使用类型内置的Parse、TryParse、 ToString、ToDouble、 ToDateTime
郑子铭
2023/08/30
2240
C# 规范整理·语言要素
[c语言日寄]数据输出
在C语言的编程实践中,数据输出是程序设计中不可或缺的一部分。无论是简单的变量值打印,还是复杂的结构体数据展示,数据输出都是我们与程序交互的重要方式。今天,我们将通过一个具体的题目来深入探讨C语言中的数据输出,分析其背后的原理和技巧,并通过实际代码示例来加深理解。
siy2333
2025/03/24
730
【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
可以使用 对象名.‘成员名’ 访问 Groovy 类的成员 , 这样写的好处是 , 不用将代码写死 , 在运行时可以自由灵活的决定要访问哪个成员 ;
韩曙亮
2023/03/30
2.4K0
【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)
初学 Kotlin , 对变量机制不清楚的同学们 , 看完这篇博客基本就对变量的定义和使用有清晰的认识 ;
韩曙亮
2023/03/27
2.7K0
【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 |  !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)
C# 中的IComparable和IComparer
在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具有多个字段),那么这个排序当然也是取决于我们特定的值。
HueiFeng
2020/01/22
5860
C# 中的IComparable和IComparer
C# 7.0简而言之 -- 02. C#基础 (1)
语句1里面计算了表达式(expression) 12 * 30, 并把结果保存到了本地变量x里面, x是整型类型.
solenovex
2018/05/03
1K0
C# 7.0简而言之 -- 02. C#基础 (1)
如何重写object虚方法
在 C# 中 Object 是所有类的基类,所有的结构和类都直接或间接的派生自它。前面这段话可以说所有的 C# 开发人员都知道,但是我相信其中有一部分程序员并不清楚甚至不知道我们常用的 ToString 、 Equals 和 GetHashCode 虚方法都来自于 Object 类,并且我们可以对它们进行重写。重写这三个虚方法可以说在项目开发中经常用到,只不过大部分开发人员并未留意这三个虚方法可以重写,而是自己写方法来实现。 下面我就来具体讲解一下它们三个应该怎么重写。在这里我需要说明的是本篇文章会大量涉及到设计规范和设计要求,代码只是作为辅助理解的形式出现,因此文章中的所有代码将会以代码段的形式出现。
喵叔
2020/09/08
8120
C#开发人员应该知道的13件事情
本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后,解决掉一些问题。 编码标准 遵照编码标准可以编写出更多可维护的代码,特别是在由多个开发人员或团队编写和维护的代码库中。例如FxCop,StyleCop和ReSharper等,就是常用的实施编码标准的工具。 开发人员:在压缩代码之前,请使用工具仔细检查是否违反了标准,并且对结果进行分析。使用工具发现的代码路径问题,不比你预期的少。 代码审查 代码审查和结对编
葡萄城控件
2018/01/10
2.3K0
C#与Java
在动态且不断发展的软件开发世界中,Java 和 C# 是两个巨头,每个都有自己独特的优势、理念和生态系统。本文深入比较了 Java 和 C#,探讨了它们的历史背景、语言特性、性能指标、跨平台功能等。
沙漠尽头的狼
2024/03/21
2220
C#与Java
C#基本概念列举说明建议收藏
1. 关键字 在C#代码中常常使用关键字,关键字也叫保留字,是对C#有特定意义的字符串。关键字在Visual Studio 环境的代码视图中默认以蓝色显示。例如,代码中的using、namespace、class、static、void等,均为C#的关键字。
全栈程序员站长
2022/07/15
1.1K0
推荐阅读
相关推荐
详解C# 序列化和反序列化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档