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 ...
随机推荐
- Oracle数据泵导入dmp文件,报ORA-39083、ORA-01917错误解决办法
将10.16.23.111数据库服务器中的数据库名称为cwy_init1的数据导出,随后在10.16.23.112数据库服务器创建空库cwy_init2,将导出的cwy_init1数据文件(cwy_i ...
- 【操作说明】全能型H.265播放器如何使用?
本播放器集成了公司业务的接口,包含了实播,回放,云台控制和回放速度控制,截图和全屏功能可以根据type直接初始化接口地址如果是第三方业务对接,也可以单独配置接口地址 正确使用H.265播放器需要按以下 ...
- CSS处理器-Less/Scss
HTML系列: 人人都懂的HTML基础知识-HTML教程 HTML元素大全(1) HTML元素大全(2)-表单 CSS系列: CSS基础知识筑基 常用CSS样式属性 CSS选择器大全48式 CSS布局 ...
- C++初阶(运算符重载汇总+实例)
运算重载符 概念: 运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似. 函数原型: 返回值 operator操作符(参数列表) 注意: ...
- python实现图片转换pdf
安装第三方库 linux平台 sudo apt install python3-reportlab python3-pil 示例代码 import sys from reportlab.pdfgen ...
- 更改HTML请求方式的几种方法
以ctfhub中的请求方式题目为例,则可以有: 法一:通过burpsuite抓包修改 在burpsuite中抓包后发送到repeater模块中,对请求方式进行修改即可 法二:通过curl命令进行 cu ...
- sql注入的一丢丢
- C++动态链接MySQL库
C++链接MySQL库 库安装目录 CMakeList cmake_minimum_required(VERSION 3.22) project(MySQLConnectionPool) includ ...
- On Java 8读书笔记
第一章 什么是对象 1.1 抽象的历程 "对象":问题空间中的元素及其解决方案空间中的具体呈现. 理念即是通过添加各种新的对象,可以将程序改编为一种描述问题的语言. 对象是具有状态 ...
- 实现 .Net 7 下的数据库定时检查
在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作.为了实现这个需求,我们在 .Net 7 下进行一次简单的演示. PeriodicTimer .Net 6 中新 ...