C# 编码标准(二)
先八卦一下,昨天写了C# 编码标准(一),得到了@h82258652的补充,感到非常欣慰,一是感觉他的观点扩展了我的视野,丰富了我的看法,所以更坚定了我继续写博客的想法,由于是五笔打字,经常不写东西,有些字的字根都忘记了,所以通过写博客也可以多记些字根,二是决定把多年的一些东西分享出来,一起沟通交流,这样也能够共同进步,共同成长。
一、编码实践
1、一个文件的代码避免超过500行。当然这个在特殊情况下也是可以的,只是一个建设吧!
2、方法要避免超过25行。当然这个在特殊情况下也是可以的,只是一个建设吧!
3、每行不要超过80个字符。
4、不要手动编辑任何机器代码。
5、避免对显而易见的代码作注释,代码应该是自解释的,由可读性强的变量和方法组成的好的代码应该不需要注释。
6、除了“0”与“1”, 不要用数值硬编码,声明一个常量代替。
7、仅对本来就是常量的值使用const修饰符,例如一周的天数。
8、避免对只读的变更使用const,在此情况下,使用readonly修饰符:
public class MyClass { public const int DaysInWeek = 7; public readonly int Number; public MyClass(int someValue) { Number = someValue; } }
9、仅捕捉你需要显式处理的异常。
10、在抛出异常的catch语句中,总是抛出最初异常(或由最初异常构建的另一个异常),以保持最初错误的堆栈位置。
第一种: catch(Exception ex) { MessageBox.Show(ex.Message); throw; // 等同于抛出原始异常 } 第二种: catch(Exception ex) { MessageBox.Show(ex.Message); throw ex; // 这样会吃掉异常点,重置堆栈中的异常起始点 } 第三种: catch { throw; // 可捕获所有类型的异常 } 第四种: catch(Exception ex) { MessageBox.Show(ex.Message); throw new Exception("经过进一步包装的异常", ex); // 经过进一步包装的异常,第二个参数保存了原来的异常信息 } 推荐使用第一种用法
11、最小化应用程序的程序集代码(即EXE客户端程序集)。用类库来包含业务逻辑。
12、避免显式类型转换。使用as操作符防御性地进行转换类型:
Dog dog = new GermanShepherd(); GermanShepherd shepherd = dog as GermanShepherd; if (shepherd != null) { ... }
13、调用委托前始终检查委托是否为空。
14、不要假定一种类型能支持某个接口。防御性地为接口查询是否支持该接口。
SomeType obj1; IMyInterface obj2; obj2 = obj1 as IMyInterface; if(obj2 != null) { obj2.Method1(); } else { ... }
15、永远不要硬编码将呈现给用户的字符串,而是使用资源。
16、永远不要硬编码布署时可能修改的字符串,例如连接字符串。
17、用String.Empty代替"":
// 避免 string name = ""; //推荐 string name = String.Empty;
18、当频繁地使用一个字符串超过4次,使用StringBuilder,不要使用string。
19、当提供一个静态成员变量时,总是提供一个静态构造函数。
20、除非在switch语句中跳转,否则永远不要用goto语句。
21、不要在使用泛型的代码中对System.Object进行类型转化。使用约束或as运算符:
class SomeClass {} // 避免 class MyClass<T> { void SomeMethod(T t) { object temp = t; SomeClass obj = (SomeClass)temp; } } // 建议 class MyClass<T> where T : SomeClass { void SomeMethod(T t) { SomeClass obj = t; } }
22、不要在泛型接口中定义约束条件。接口级别的约束常常可以用强类型代替:
public class Customer {...} // 避免 public interface IList<T> where T : Customer {...} // 建议 public interface ICustomerList : IList<Customer>
23、lock锁私有只读静态对象。不要使用lock (this)、lock (typeof (MyType)) 和 lock ("myLock")等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?