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 ...
随机推荐
- mybatis-增删改查和配置
加入log4j日志功能 加入依赖 <!-- log4j日志 --> <dependency> <groupId>log4j</groupId> < ...
- JS逆向实战1——某省阳光采购服务平台
分析 其实这个网站基本没有用到过什么逆向,就是简单的图片base64加密 然后把连接变成2进制存成文件 然后用ocr去识别即可 !! 注意 在获取图片连接 和对列表页发起请求时一定要用一个请求,也就是 ...
- Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持
Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(33)-Fiddler如何抓取WebSocket数据包
1.简介 本来打算再写一篇这个系列的文章也要和小伙伴或者童鞋们说再见了,可是有人留言问WebSocket包和小程序的包不会抓,那就关于这两个知识点宏哥就再水两篇文章. 2.什么是Socket? 在计算 ...
- 第一章 计算机和C++简介
1.1 简介 C++是一种强大的计算机面向对象编程的程序设计语言,它是制造软件的一种编程语言,适合程序员和刚接触编程的技术人员.当今智能手机销量爆炸式增长给移动应用程序的开发带来了很多机会,而C++就 ...
- Karmada跨集群优雅故障迁移特性解析
摘要:在 Karmada 最新版本 v1.3中,跨集群故障迁移特性支持优雅故障迁移,确保迁移过程足够平滑. 本文分享自华为云社区<Karmada跨集群优雅故障迁移特性解析>,作者:Karm ...
- HDC2022的无障碍参会体验,手语服务是如何做到的?
华为开发者大会2022(HDC)上,HMS Core手语数字人以全新形象亮相,并在直播中完成了长达3个多小时的实时手语翻译,向线上线下超过一千万的观众提供了专业.实时.准确的手语翻译服务,为听障人士提 ...
- Linux和shell面试内容
一.Linux 1.列出5个常用高级命令 ps -ef ps -aux df -h top io top xargs tail uptime netstat 2.查看磁盘使用情况.查看进程.查看端口号 ...
- 介绍一款高性能分布式MQTT Broker(带web)
SMQTTX介绍 SMQTTX是基于SMQTT的一次重大技术升级,基于Java开发的分布式MQTT集群,是一款高性能,高吞吐量,并且可以完成二次开发的优秀的开源MQTT broker,主要采用技术栈: ...
- go-carbon 1.5.1 版本发布, 修复已知 bug 和新增土耳其翻译文件
carbon 是一个轻量级.语义化.对开发者友好的golang时间处理库,支持链式调用. 目前已被 awesome-go 收录,如果您觉得不错,请给个star吧 github.com/golang-m ...