代码部分
1.正确操作字符串
尽量少装箱
String str1 = "str2"+9.ToString();
避免分配额外的内存空间
StringBuilder
2.使用默认转型方法
使用类型的转换运算符
编译器直接支持的数据类型,即直接映射到FCL中的类型。包括sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool、decimal、object、string
使用类型内置的方法
Parse,TryParse,ToString,ToDouble,ToDateTIme
使用帮助类提供的方法
System.Convert和System.BitConverter
使用CLR支持的转型
基类和子类的相互转换
3.区别对待强制转型与as和is
强转 继承public static explicit operator 类名(待转换类名)
as 不抛出异常
4.TryParse比Parse好
5.使用int?来确保值类型也可以为null
6.区别readonly和const的使用方法
const是编译器常量(自带static),readonly是一个运行时常量
const只能修饰基元类型,枚举或者字符串,readonly没有限制
"readonly第一次被赋值后不可以改变
1.对于值类型,值本身不可改变
2.对于引用类型,引用本身(指针)不可改变"
7.将0值作为枚举的默认值
编译器会从0值开始计数
8.习惯重载运算符
9.创建对象时需要考虑是否实现比较器
实现Icompareable或Icomparer<T>
10.区别对待==和Equals
"对于值类型,如果类型的值相等,就应该返回True对于应用类型,如果类型指向同一个对象,则返回True"
11.为类型输出格式化字符串
12.用dynamic简化反射实现
dynamic 类 x = new 类();
13.元素数量可变的情况下不应使用数组
一维数组:newarr,ldelemldelmea, stelem
14.使用List<T>而不是用ArrayList
List<T> SortedList<T> ConcurrentBag<T>
Dictionary<Tkey,Tvalue> StortedDictionary<Tkey,Tvalue> ConcurrentDictionary<Tkey,Tvalue>
HashSet<T> StortedSet<T>
Queue<T> ConcurrentQueue<T>
Stack<T> ConcurrentStack<T>
15.确保集合的线程安全
需要使用lock进行锁定
16.迭代器不要有可写属性
17.谨慎集合中的可写属性
18.使用匿名类型存储LINQ查询结果
var personWithCompanyList = from person in personList join company in companyList on person.CompanyID qeuals company.ComanyID select new {PersonName=person.Name, CompanyName = company.Name}
19.查询中受用Lambda表达式
20.延迟求值和主动求职的区别
from c in list where c>5 select c 延迟求值
(from c in list where c>5 select c).ToList<int>(); 主动求值
21.区别Linq查询中的Ienumerable<T>和Iqueryable<T>
IEnumerable<T> 本地数据源 基本变量
IQueryable<T> 远程数据源 数据库 不能直接使用自定义方法
22.使用LINQ取代集合中的比较器和迭代器
23.使用Linq时注意不必要的迭代
(from c in list select c).Take(2).ToList() 只迭代两次
(from c in list where c.name=="Mike" select c).First() 拿到就返回
泛型/委托和事件
24.尽可能使用泛型
25.避免在泛型类型中声明静态成员
泛型中数据类型不一致,则静态成员不共享
26.为泛型参数设定约束
public int Compare<T>(T t1, T t2) where T:Salary
此时T变为了Salary类,就拥有了其相关属性
27.使用default为泛型类型变量指定初始值
28.使用FCL中的委托声明
Action,Func,Predicate
29.使用Lambda进行委托
Func<int, int, int> add = delegate(int I, int j){return i+j;};
Action<string> print = delegate(string msg){Console.WriteLine(msg);};
print(add(1,2).ToString());
Func<int, int, int> add =(I, j)=>{return i+j;};
Action<string> print = (msg)=>{Console.WriteLine(msg);};
30.小心闭包中的陷阱
触发方法时才会调用方法
31.使用event关键字为委托施加保护
32.标准的事件模型
public delegae void EventHandler(object sender, EventArgs e);
委托类型的名称以EventHandler结束
委托原型返回值为void
委托原型有两个参数:sender表示事件触发者,e表示事件参数
事件参数的名称以EventArgs结束
33.为泛型类型参数指定逆变
资源管理和序列化
1.显示释放资源需集成接口Idisposable
2.必要时应将不再使用的对象引用赋值为null
静态变量不会主动Disposable
3.为无用字段标注不可序列化
[Serializable] 序列化
[NonSerialized] 不序列化
[fidle:NonSerialized] 事件非序列化
public class BinarySerializer{
//将类型序列化为字符串
public static string Serialize<T>(T t){
using(MemoryStream stream = new MemoryStream()){
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, t);
return System.Text.Encoding.UTF8.GetString(stream.ToArray());
}
}
// 将类型序列化为文件
public static void SerializeToFile<T>(T t, string path, string fullName){
if(!Directory.Exists(path)){Directory.CreateDirectory(path);}
string fullPath = $""{pth}\{fullName}"";
using(FileStream stream = new FileStream(fullPath, FileMode.OpenOrCreate))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, t);
stream.Flush();
}
}
//将字符串反序列化为类型
public static TResult Deserialize<TResult>(string s) where TResult:class{
byte[] bs = System.TextEncoding.UTF8.GetBytes(s);
using (MemoryStream stream = new MemoryStream(bs)){
BinaryFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(stream) as TResult;
}
}
//将文件反序列化为类型
public static TResult DeserializeFromFile<TResult>(string path) where TResult:class{
using(FileStream stream = new FileStream(path, FileMode.Open)){
BinaryFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(stream) as TResult;
}
}
}
4.利用定制特性减少可序列化的字段
OnDeserializedAttribute 指定对象反序列化后立即调用此方法
OnDeserializeingAttribute 指定在反序列化时调用此方法
OnSerializedAttribute 指定在序列化该对象后是否调用该方法
OnSerializingAttribute 指定在对象序列化前调用此方法
5.使用集成Iserializable接口更灵活的控制序列化过程

C#如何提高代码质量(一)的更多相关文章

  1. 提高代码质量 CheckStyle FindBugs PMD

    提高代码质量-工具篇 注:这是一篇翻译文章,原文:How to improve quality and syntax of your Android code,为了理解连贯,翻译过程中我修改了一些陈述 ...

  2. Findbug在项目中的运用--提高代码质量

     FindBugs是一个静态分析工具,它检查类或者 JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析 第一 手动安装 在Ec ...

  3. Web前端开发最佳实践(11):使用更严格的JavaScript编码方式,提高代码质量

    前言 JavaScript语言由于其固有的灵活性,所以导致开发者可以写出很多诡异的代码,甚至一些较为正常的特性,如类型隐式转换.this的指代等等,也会让刚接触此语言的开发者头大不已.尤其是那些熟知其 ...

  4. (转)提高代码质量---one

    1. 摘要 这是烂代码系列的第二篇,在文章中我会跟大家讨论一下如何尽可能高效和客观的评价代码的优劣. 在发布了关于烂代码的那些事(上)之后,发现这篇文章竟然意外的很受欢迎,很多人也描(tu)述(cao ...

  5. SonarQube与Jenkins结合提高代码质量

    首先,为什么需要SonarQube? 1.WriteClean Code 1)全局健康报告  2)关注新增的问题  3)强制QualityGate 4)Issue详情及建议- 详情参考:https:/ ...

  6. 用 Eclipse 插件提高代码质量

    如果能在构建代码前发现代码中潜在的问题会怎么样呢?很有趣的是,Eclipse 插件中就有这样的工具,比如 JDepend 和 CheckStyle,它们能帮您在软件问题暴露前发现这些问题.在 让开发自 ...

  7. 提高代码质量系列之二:重构小技巧——if篇

    前言: if,相信是童鞋们使用的最频繁的关键字了,而且很多时候,我们使用的if都是在无意识的状态下随手而为.键入if,两下回车(我使用了resharper,可以自动编排if的格式),再信手写下我们需要 ...

  8. 测试驱动开发(Test-Driven Development,简称TDD)--单元测试-->提高代码质量

    !!! 1.估算和做项目计划时要算上单元测试时间 2.开发之前写单元测试代码 盖房子的时候,工人师傅砌墙,会先用桩子拉上线,以使砖能够垒的笔直,因为垒砖的时候都是以这根线为基准的.TDD就像这样,先写 ...

  9. linux 提高代码质量的工具

    很多IT公司对于软件开发都有严格的分工,这包括设计.测试.服务支持等等.但是,我一直都认为只有开发者才是真正对软件质量负责的人.没有好的软件设计,软件质量基本上是无从谈起.当然,要做到这一点是需要额外 ...

  10. 使用flow捕获js错误提高代码质量

    本文将介绍Flow及其主特性.下面分别从如何安装设置,如何添加类型注释,如何在运行时自动去掉注释等方面来介绍. 安装 目前Flow兼容的操作系统有Mac OS X,Linux(64位),Windows ...

随机推荐

  1. R数据分析:扫盲贴,什么是多重插补

    好多同学跑来问,用spss的时候使用多重插补的数据集,怎么选怎么用?是不是简单的选一个做分析?今天写写这个问题. 什么时候用多重插补 首先回顾下三种缺失机制或者叫缺失类型: 上面的内容之前写过,这儿就 ...

  2. Python基础之函数:4、二分法、三元表达式、生成/推导式、匿名函数、内置函数

    目录 一.算法简介之二分法 1.什么是算法 2.算法的应用场景 3.二分法 二.三元表达式 1.简介及用法 三.各种生成式 1.列表生成式 2.字典生成式 3.集合生成式 四.匿名函数 五.常见内置函 ...

  3. 剑指offer20题表示数值的字符串:这题实在是太优雅了

    目录 前言 一.憨憨初解 1.思路 2.代码 3.战绩 4.反思 二.看懂再解 1.思路 2.代码 3.C++版战绩 总结 前言 题目来源:https://leetcode.cn/problems/b ...

  4. 设置CMD命令的初始目录

    本文提供两种方式,第一种通过打开桌面上的快捷方式实现,第二种可以通过 CMD 命令直接进入. 快捷方式 "开始 ---> 程序 ---> 附件",右键单击 " ...

  5. 动态爱心-详细教程(小白也会)(HTML)

    动态爱心 超级超级超级简单!!!赶紧做给你们的"Ta"看吧! (最后有详细步骤) 视频效果: 话不多说直接上代码 点击查看代码 <!DOCTYPE HTML PUBLIC & ...

  6. Go | 函数(包)的使用

    本文通过一个实现加减乘除运算的小程序来介绍go函数的使用,以及使用函数的注意事项,并引出了对包的了解和使用. 实现加减乘除运算 传统方法实现: var n1 float64 = 1.2 var n2 ...

  7. Redis Cluster 数据分片

    介绍 Redis Cluster Redis 集群是 Redis 提供的分布式数据库方案, 集群通过分片(sharding) 来进行数据共享, 并提供复制和故障转移功能. 节点 一个 Redis 集群 ...

  8. Perl语言中一些内置变量等,$x、qw、cmp、eq、ne等

    转载 Perl语言中一些内置变量等,$x.qw.cmp.eq.ne等 字母 符号 释义 eq  = = equal(等于) ne != not equal(不等于) cmp 比较 qq  " ...

  9. 第2-3-2章 环境搭建-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

    目录 5. 文件服务开发 5.1 环境搭建 5.1.1 数据库环境搭建 5.1.2 Nacos环境搭建 5.1.3 Nginx环境搭建 5.1.4 maven工程环境搭建 5. 文件服务开发 全套代码 ...

  10. 命令查询职责分离 - CQRS

    概念 CQRS是一种与领域驱动设计和事件溯源相关的架构模式, 它的全称是Command Query Responsibility Segregation, 又叫命令查询职责分离, Greg Young ...