C#如何提高代码质量(二)
多线程,异步,任务和并行
1.异步和多线程应用场景区分
多线程 计算密集型工作
异步 IO密集型工作
2.线城同步中使用信号量
EventWaitHandle AutoResetEvent ManualResetEvent
Semaphore
Mutex
3.避免锁定不恰当的同步对象
1.需要同步的多个线程中是可见的同一个对象
2.非静态方法,静态变量不能作为同步对象
3.值类型对象不能作为同步对象
4.避免将字符串作为同步对象
5.降低同步对象的可见性
4.警惕线城的IsBackground
前台线城->线城不结束,主进程不结束
后台线城->主进程结束,线城自动结束
5.警惕线城的优先级
Thread.Priority = ThreadPriority.Highest
6.正确的关闭线城
CancellationToeknSource类的Token.isCancellationRequested方法
7.用ThreadPool或BackgroundWorker代替Thread
8.PLINQ
varqueryParaller1 = from p in intList.AsParallel().AsOrdered() select p;
queryParalle1.ForAll((item) =>…});
架构篇
成员设计
1.谨慎将数组或集合作为属性
public Ilist<Object> Employees {get;private set;}
2.构造方法应初始化主要属性和字段
3.区别对待override和new
子类方法中带有new-> 独立于基类的方法
子类方法中带有override->调用该方法,而非基类的方法
4.成员应优先考虑公开基类或接口
public Ienumberable<Tresult> Empty<Tresult>(){return EmptyEnumerable<Tresult>.Instance;}
5.优先考虑将基类型或接口作为参数传递
public static Ienumberable<Tsource> Task<Tsource>(this Ienumberable<Tsource>source, int count)
6.用params减少重复参数
void Method(string str, params object[] args){}
7.静态方法和实例方法没有区别
8.使用扩展方法,向现有类型“添加“方法
public static string GetSexString(this Student student){return "";}
优点 可以扩展密封类型
可以扩展第三方程序集中的类型
扩展方法可以避免不必要的深度继承体系
约定 扩展方法必须放在静态类中,且该类不能是嵌套类
扩展方法必须是静态的
扩展方法的第一个参数必须是要扩展的类型,且必须加上this
不支持扩展属性,事件(能扩展接口,例如Linq)
类型设计
1.区分接口和抽象类的应用场合
区别 接口支持多继承,抽象类则不能
接口可以包含方法,属性,索引器,事件的签名,但不能有实现,抽象类可以
接口新增方法后,所有继承者都需要重构,抽象类不需要
场景 对象存在多个功能相近且关系紧密,使用抽象
关系不紧密,若干功能有共同的声明,使用接口
抽象适用于提供丰富功能的场合,接口倾向于提供单一的一组功能
实例 流(stream):抽象 类型(Object):接口
2.多态代替条件语句
3.使用私有化构造函数强化单例
4.静态类添加静态构造函数
特点 只被调用一次,且在第一次调用类成员之前被运行时执行
代码无法调用它,不像实例构造方法使用new就能执行
没有访问标识符
不能带任何参数
5.sealed:组织类型被其它类继承
6.类代替enum
7.避免双向耦合
A调用B,B调用A
8.将现实世界的对象抽象为类,将可复用对象圈起来就是命名空间
安全性设计
1.声明变量前考虑最大值
ushort最大后会变为0,使用checked{}来抛出此类异常
2.MD5不在安全
3.通过HASH来验证文件是否被篡改
using(MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()){
using(FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)){
return BitConvert.ToString(md5.ComputeHash(fs)).Replace(""-"", """");
}
}
4.避免非对称算法加密文件
5.使用SSL确保通信中的数据安全
6.使用SecureString保存密钥等机密字符串
static Ssytem.Security.SecureSeting secureString = new SecureString();
保存:secureString.AppendChar('w');
取:IntPtr addr = Marshal.SecureStringToBSTR(secureString);
string temp = Marshal.PtrToStringBSTR(addr);
释放:Marshal.ZeroFreeBSTR(addr);
7.不要使用自己的加密算法
DES,AES,RC4,RSA,TEA,MD5
密钥是关键
8.为程序集指定强名称
sn -k yourprofile.snk
命名规范
以<Company>.<Component>为命名空间
用名词和名词组给类型命名
用形容词组给接口命名
派生类的名词以基类的名字作为后缀
泛型类型参数以T作为前缀
以复数命名枚举类型,以单数命名枚举元素
用PascalCasing命名公开元素
考虑用类名作为属性名
用camelCasing命名私有字段和局部变量
有条件的使用前缀
代码整洁
表驱动
static void Main(string[] args){
SampleClass sample = new SampleClass();
var addMethod = typeof(SampleClass).GetMethod(ActionInTable(WeekMonday));
addMethod.Invoke(sample, null);
}
static string ActionInTable(Week week){
string[] methods = {""Cleaning"", ""CleanCloset"", ""Quarrel"", ""Shopping""};
return methods[(int)week];
}
class SampleClass{
public void Cleaning(){Colsole.WriteLine(""打扫"");}
public void CleanCloset(){Console.WriteLine(""吵架"");}
}
使用时间访问器替代公开的事件成员变量
规范化开发
自动化测试(黑盒)
Code UI Automation
C#如何提高代码质量(二)的更多相关文章
- 提高代码质量 CheckStyle FindBugs PMD
提高代码质量-工具篇 注:这是一篇翻译文章,原文:How to improve quality and syntax of your Android code,为了理解连贯,翻译过程中我修改了一些陈述 ...
- Findbug在项目中的运用--提高代码质量
FindBugs是一个静态分析工具,它检查类或者 JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析 第一 手动安装 在Ec ...
- Web前端开发最佳实践(11):使用更严格的JavaScript编码方式,提高代码质量
前言 JavaScript语言由于其固有的灵活性,所以导致开发者可以写出很多诡异的代码,甚至一些较为正常的特性,如类型隐式转换.this的指代等等,也会让刚接触此语言的开发者头大不已.尤其是那些熟知其 ...
- (转)提高代码质量---one
1. 摘要 这是烂代码系列的第二篇,在文章中我会跟大家讨论一下如何尽可能高效和客观的评价代码的优劣. 在发布了关于烂代码的那些事(上)之后,发现这篇文章竟然意外的很受欢迎,很多人也描(tu)述(cao ...
- SonarQube与Jenkins结合提高代码质量
首先,为什么需要SonarQube? 1.WriteClean Code 1)全局健康报告 2)关注新增的问题 3)强制QualityGate 4)Issue详情及建议- 详情参考:https:/ ...
- 用 Eclipse 插件提高代码质量
如果能在构建代码前发现代码中潜在的问题会怎么样呢?很有趣的是,Eclipse 插件中就有这样的工具,比如 JDepend 和 CheckStyle,它们能帮您在软件问题暴露前发现这些问题.在 让开发自 ...
- 提高代码质量系列之二:重构小技巧——if篇
前言: if,相信是童鞋们使用的最频繁的关键字了,而且很多时候,我们使用的if都是在无意识的状态下随手而为.键入if,两下回车(我使用了resharper,可以自动编排if的格式),再信手写下我们需要 ...
- 测试驱动开发(Test-Driven Development,简称TDD)--单元测试-->提高代码质量
!!! 1.估算和做项目计划时要算上单元测试时间 2.开发之前写单元测试代码 盖房子的时候,工人师傅砌墙,会先用桩子拉上线,以使砖能够垒的笔直,因为垒砖的时候都是以这根线为基准的.TDD就像这样,先写 ...
- linux 提高代码质量的工具
很多IT公司对于软件开发都有严格的分工,这包括设计.测试.服务支持等等.但是,我一直都认为只有开发者才是真正对软件质量负责的人.没有好的软件设计,软件质量基本上是无从谈起.当然,要做到这一点是需要额外 ...
- 使用flow捕获js错误提高代码质量
本文将介绍Flow及其主特性.下面分别从如何安装设置,如何添加类型注释,如何在运行时自动去掉注释等方面来介绍. 安装 目前Flow兼容的操作系统有Mac OS X,Linux(64位),Windows ...
随机推荐
- "xxx cannot be cast to jakarta.servlet.Servlet "报错解决方式
在做jsp的上机时候同学出现了一个500错误:com.kailong.servlet.ComputeBill cannot be cast to jaka.servlet.Servlet 然后因为我用 ...
- <一>类,对象,this指针
C++ 类:实体的抽象类型 实体(属性,行为) ->ADT(abstract data type) 类(属性->成员变量,行为->成员方法) OOP语言4大特征 抽象 封装/隐藏(通 ...
- STF的DOCKER搭建
OPENSTF OpenSTF(Smartphone Test Farm)是一个web端移动设备管理平台,可以从浏览器端远程调试.远程管理设备.其实有点类似于我们现在很火热的云测平台,如:testin ...
- 定制ASP.NET Core的身份认证
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本章,我们将学习如何定制ASP.NET Core认证机制.微软把安全认证当做AS ...
- 2021年WebStorm安装破解教程
一.WebStorm工具介绍 WebStorm是一款JavaScript 开发工具,为JavaScript和编译到JavaScript语言.Node.js.HTML和CSS提供了智能编码帮助.享受代码 ...
- 基于python的数学建模---灰色与模糊问题
instance: 我们先对此数据集进行轮廓系数的计算 from sklearn import metrics import matplotlib.pyplot as plt from sklearn ...
- (C++) std::move std::forward及使用
概念 std::ref :针对std::thread,需要把实参显式转换为引用类型: std::move :无条件把参数转换为右值:但是右值赋值给新变量时,实际还要看是否满足右值条件,如const s ...
- Spring Boot中@Import三种使用方式!
需要注意的是:ImportSelector.ImportBeanDefinitionRegistrar这两个接口都必须依赖于@Import一起使用,而@Import可以单独使用. @Import是一个 ...
- 关于最新版本listen1 (2.1.6)的修改心得(添加下载功能)
注:本文只作为技术交流 前言 再次感谢 listen1 的作者开发出如此强大的音乐播放器 项目地址 上一篇的文章没有解决跨域问题(命名不能正确命名), 上一篇文章 地址 这次解决了,并简单的美化了下载 ...
- MyEclipse 中自动安插作者、注释日期等快捷键方法
MyEclipse 中自动插入作者.注释日期等快捷键方法 MyEclipse 中自动插入作者.注释日期等de快捷键方法依次打开然后找到 Window -->Preferences->Jav ...