编写高质量代码改善C#程序的157个建议——导航开篇

简介: 前言   由于最近工作重心的转移,原来和几个同事一起开发的项目也已经上线了,而新项目就是在现有的项目基础上进行优化延伸扩展。打个比方,现在已经上线的项目行政案件的Web管理网站(代码还没那么多相比较即将要做的刑事案件吧),而新项目是刑事案件的Web管理网站,之后行政和刑事这两个网站是要合并的。

前言

  由于最近工作重心的转移,原来和几个同事一起开发的项目也已经上线了,而新项目就是在现有的项目基础上进行优化延伸扩展。打个比方,现在已经上线的项目行政案件的Web管理网站(代码还没那么多相比较即将要做的刑事案件吧),而新项目是刑事案件的Web管理网站,之后行政和刑事这两个网站是要合并的。前段时间也和同事以及上司的讨论结果就是新建一套项目,考虑将原有系统各种组件进行重新封装、优化、提升扩展,然后先开发刑事案件的网站,待刑事案件开发完毕将原有项目按照刑事案件的思路重新整合。

  最近刚开始进行查看老代码也发现太多的问题,感觉无从下手,有些东西当时都是只是实现了功能而已,由于自己经历和经验都还很有限。所以打算来学习一下,无独有偶发现了这本书,哈哈,自己感觉也很不错,所以想在此做下笔记。

                                                         

为什么要来看这本书

   写此书的作者在书中也有明确的记录。作者一直在思考一个问题:就是到底什么样的编程书籍能够帮助入门者快速进阶?所谓“入门者”指的是已经可以使用一门语言来编写程序,但是不太明白如何编写高质量代码的人。作者回忆自己开发生涯的入门阶段发现,那时候常常被以下三类问题所困扰。

  第一类来自于语言本身。

  1、如何格式化字符串才是最高效的?

  2、基本类型间或其他CLR类型间的转换怎样才算是最高效的?

  3、for和foreach有什么区别,何时该用for,何时又该用foreach?

  4、什么是Dispose模式,为什么要释放资源,如何释放资源?

  5、多线程应该选择何种方式来开启和结束,各线程之间为什么要同步,如何同步,如何锁定资源?

  第二类来自于设计框架如果你对编程充满热爱,相信你的大脑很快就会充满以下这些问题

  1、使用单例模式还是静态类,为什么有了静态类还需要单例模式?

  2、该使用静态方法还是实例方法,它们的本质区别是什么?

  3、如何使用异常才是最正确的,什么时候抛出异常,什么时候“吃掉”异常,为什么需要自定义异常?

  4、如何避免过多的条件判断分支?

  5、如何保证程序的数据安全和通信安全?

  第三类问题最常见,可能来自于编码习惯和编程思想。

  1、一个文件只包含一个类比较好,还是一个文件可以包含多个类?

  2、如何命名才是专业级别的?

  3、应该使用抽象类还是接口?

  4、到底什么才是真正的面向对象编码,我这样编程够面向对象吗?

  5、什么是单元测试,如何编写单元测试?

如果你也曾问过自己类似的问题,说明你已经为专业程序员做好了准备了。当然如果你还是苦于找不到答案的话,或许你也可以来阅读下此书,相信你会收获颇丰的。自己大致看了一下此书,感觉作者还是花了很多心思的,很多知识讲解的还是都很不错的,在此也只是希望更多的人受益,当然不喜勿喷额。

本书大纲目录

 第一部分 语言篇

  1、第一章 基本语言要素

http://www.cnblogs.com/aehyok/p/3624478.html[1-3]

  建议1、正确使用字符串

  建议2、使用默认转型方法

  建议3、区别对待强制转型与as和is

http://www.cnblogs.com/aehyok/p/3629760.html[4-9]

  建议4、TryParse比Parse好

  建议5、使用int?来确保值类型也可以为null

  建议6、区别readonly和const的使用方法

  建议7、将0值作为枚举的默认值

  建议8、避免给枚举类型的元素提供显式的值

  建议9、习惯重载运算符

http://www.cnblogs.com/aehyok/p/3631483.html[10-12]

  建议10、创建对象时需要考虑是否实现比较器

  建议11、区别对待==和Equals

  建议12、重写Equals时也要重写GetHashCode

http://www.cnblogs.com/aehyok/p/3634984.html[13-15]

  建议13、为类型输出格式化字符串

  建议14、正确实现浅拷贝和深拷贝

  建议15、使用dynamic来简化发射实现

  2、第二章 集合和LINQ

http://www.cnblogs.com/aehyok/p/3637504.html[16-19]

  建议16、元素数量可变的情况下不应使用数组

  建议17、在多数情况下使用foreach进行循环遍历

  建议18、foreach不能代替for

  建议19、使用更有效的对象和集合初始化

http://www.cnblogs.com/aehyok/p/3641896.html[20-22]

  建议20、使用泛型集合来替代非泛型集合

  建议21、选择正确的集合

  建议22、确保集合的线性安全

http://www.cnblogs.com/aehyok/p/3657862.html [23-25]

  建议23、避免将List<T>作为自定义集合类的基类 

  建议24、迭代器应该是只读的

  建议25、谨慎集合属性的可写操作

http://www.cnblogs.com/aehyok/p/3674866.html [26-28]

  建议26、使用匿名类型储存LINQ查询结果

  建议27、在查询中使用Lambda表达式

  建议28、理解延迟求值和主动求值之间的区别

http://www.cnblogs.com/aehyok/p/3712725.html[29-31]

  建议29、区别LINQ查询中的IEnumerable<T>和IQueryable<T>

  建议30、使用LINQ取代集合中的比较器和迭代器

  建议31、在LINQ查询中避免不必要的迭代

  3、第三章 泛型、委托和事件

http://www.cnblogs.com/aehyok/p/3719825.html [32-34]

  建议32、总是优先考虑泛型

  建议33、避免在泛型类型中声明静态成员

  建议34、为泛型参数设定约束

http://www.cnblogs.com/aehyok/p/3725313.html[35-37]

  建议35、使用default为泛型类型指定初始值

  建议36、使用FCL中的委托声明

  建议37、使用lambda表达式代替方法和匿名方法

http://www.cnblogs.com/aehyok/p/3730417.html[38-41]

  建议38、小心闭包中的陷阱

  建议39、了解委托的实质

  建议40、使用event关键字对委托施加保护

  建议41、实现标准的事件模型

http://www.cnblogs.com/aehyok/p/3737426.html[42-45]

  建议42、使用泛型参数兼容泛型接口的不可变性

  建议43、让接口中的泛型参数支持协变

  建议44、理解委托中的协变

  建议45、为泛型类型参数指定协变

  4、第四章 资源管理和序列化

  5、第五章 异常和自定义异常

http://www.cnblogs.com/aehyok/p/3750122.html[58-60]

  建议58、用抛出异常代替返回错误代码

  建议59、不要在不恰当的场合下引发异常

  建议60、重新引发异常时使用inner Exception

http://www.cnblogs.com/aehyok/p/3761583.html[61-64]

  建议61、避免在finally内撰写无效代码

  建议62、避免嵌套异常

  建议63、避免“吃掉”异常

  建议64、为循环增加Tester-Doer模式而不是将try-catch置于循环内

  6、第六章 异步、多线程、任务和并行

第二部分  架构篇

  7、第七章 成员设计

  8、第八章 类型设计

  9、第九章 安全性设计

第三部分 编码规范及习惯

  10、第十章 命名规范

  11、第十一章 代码整洁

  12、第十二章 规范开发行为

总结

   从书的开头看起到目录,这本书真真的深深的吸引了我,好像就如作者所说,正中下怀一样。作者所想的那三类问题,有些问题我曾经的确也考虑过,要去找为什么,但是后来放弃了,或者遗忘了,不过今天终于又让我看到了这似曾相识的感觉,这次我要将这些问题一一的剖解,希望自己能多多的学习书中的知识和奥妙吧。

  看了上面的,也许很多人和我有同样的想法,要好好来看看这本书,那么我希望大家可以将看书后的一些想法或者问题,发布出来让大家一起来探讨一下,让我等菜鸟也可以多多的见识见识。暂时我也在考虑要不要入手一本,这不刚刚在网上下载的PDF。由于此书的章节并没有关联性,也可以是你需要那些知识,直接看那些章节就可以了。所以自己打算在工作中遇到问题可以直接对症下药了。

目录
相关文章
|
5月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
538 27
|
7月前
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
542 11
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
724 2
|
12月前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
553 13
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
321 2
|
API C#
C#实现Winform程序右下角弹窗消息提示
C#实现Winform程序右下角弹窗消息提示
725 1
|
C# 容器
C#中的命名空间与程序集管理
在C#编程中,`命名空间`和`程序集`是组织代码的关键概念,有助于提高代码的可维护性和复用性。本文从基础入手,详细解释了命名空间的逻辑组织方式及其基本语法,展示了如何使用`using`指令访问其他命名空间中的类型,并提供了常见问题的解决方案。接着介绍了程序集这一.NET框架的基本单位,包括其创建、引用及高级特性如强名称和延迟加载等。通过具体示例,展示了如何创建和使用自定义程序集,并提出了针对版本不匹配和性能问题的有效策略。理解并善用这些概念,能显著提升开发效率和代码质量。
464 4
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
478 2
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
1123 0

热门文章

最新文章