![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#-高质量代码
东北砍王
做游戏,是种梦想!
展开
-
高质量代码之事件访问器
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~事件访问器功能:1.添加访问器。2.删除访问器。如果涉及公开的事件字段,应该始终使用事件访问器。代码如下:class SampleClass{ private event Action testAction; public event Action TestAction { add { testAction原创 2021-03-31 13:22:08 · 155 阅读 · 0 评论 -
高质量代码之表驱动法
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~随着开发,经常遇到很长的 if 和 switch 分支。比如:enum EWeek{ Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}private string GetChineseWeek(EWeek week){ switch (week)原创 2021-03-31 13:21:32 · 221 阅读 · 0 评论 -
高质量代码之安全性
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~什么是安全性?安全性是软件开发中很重要的一环。包括:数据安全和代码安全。1.变量最大值程序员都会犯的错就是变量超出了最大值。可以使用 check 关键字,在运算溢出的时候会抛出异常 OverflowException。ushort value = 65534;checked{ value++;}2.MD5不再安全虽然 MD5 是不可逆的。但是可以通过穷举法进行暴力原创 2021-03-31 13:20:59 · 529 阅读 · 0 评论 -
高质量代码之类型设计
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~什么是类型?就是 Class。1.区分接口和抽象类区别:a.接口支持多继承,抽象类则不能。b.接口可以包含方法、属性、所引起、事件的签名,但不能有实现;抽象类可以有实现。c.接口在新增方法后,所有的继承者都必须重构,否则编译器不通过;抽象类不需要。如何使用两者呢?a.如果对象存在多个功能相近且关系紧密的版本,就是用抽象类。b.如果对象关系不紧密,但是若干功能拥有共同的声明,就使用接原创 2021-03-29 22:28:32 · 70 阅读 · 0 评论 -
高质量代码之成员设计
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~什么是成员?指字段和方法。1.不要为抽象类提供 public 的构造方法。抽象类如果没有指定构造方法,编辑器会生成一个 protected 的构造方法。抽象类不设计的本意是能让子类继承,不是用于生成对象实例的,所以这是没必要的。2.多使用属性属性和字段的本质区别:属性是方法。针对一个属性public string Name{ get;set;}编辑器会生成一个字段和两原创 2021-03-29 22:28:04 · 75 阅读 · 0 评论 -
高质量代码之赋值null
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~有没有必要将不再使用的对象设置为 null 呢?没有太大必要。这里就不做详细介绍了,有些编译器甚至会将:s = null;这样的代码忽略到,根本不被编译。注意:类型的静态字段需要及时赋值为 null。class SampleClass{ static string value = "test_value";}静态字段一经创建,垃圾回收器始终不会把它认成垃圾,除非显原创 2021-03-29 22:27:23 · 174 阅读 · 0 评论 -
高质量代码之资源释放
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~垃圾回收机制会自动回收资源(自动调用终结器),还需要手动释放资源吗?当然需要。什么时候会发生垃圾回收:系统具有低的物理内存。托管堆上已分配的对象使用内存超出了可接受的范围。调用 GC.Collect 方法。看下面的代码:public void TestFunc(){ FileStream fileStream = new FileStream("test.txt", Fi原创 2021-03-29 22:26:35 · 323 阅读 · 0 评论 -
高质量代码之资源管理
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~资源管理(尤其是内存回收)曾经是程序员的噩梦。虽然CLR在后台已经为垃圾回收做了很多事情,但是还需要知道一些知识。什么是资源?资源分为两种:1.托管资源:由CLR管理分配和释放的资源,即从CLR里 new 出来的对象。(公共语言运行库 (common language runtime,CLR) 是托管代码执行核心中的引擎。运行库为托管代码提供各种服务,如跨语言集成、代码访问安全性、对象生存原创 2021-03-29 22:26:09 · 112 阅读 · 0 评论 -
高质量代码之协变与逆变
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~协变:就是让返回值类型返回比声明类型派生程度更大的类型。下面的代码就是一个例子:class Parent{}class Child: Parent{}public Parent Get(){ return new Child();}但是某些使用泛型的地方的使用就会有问题:List<Child> childList = new List<Child原创 2021-03-29 22:25:26 · 89 阅读 · 0 评论 -
高质量代码之委托本质
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~C# 的委托有两个要点:1.委托是方法指针。2.委托是一个类,当对其进行实例化的时候,要将引用方法作为它的构造方法的参数。举个例子:public delegate void TestHandler(int param);有这样一个委托,生成的 IL 代码就是一个类:使用方式:TestHandler(param);//相当于调用TestHandle.Invoke(param);原创 2021-03-29 22:24:13 · 88 阅读 · 0 评论 -
高质量代码之闭包
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~先来看一段代码:List<Action> lists = new List<Action>();for (int i = 0; i < 5; i++){ Action t = () => { Console.WriteLine(i.ToString()); }; lists.Add(t);}foreac原创 2021-03-29 22:23:43 · 117 阅读 · 0 评论 -
高质量代码之字典
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~减少对 Dictionary 的冗余访问平时可能会这么写代码:Dictionary<int, string> dict;int key;string value;if (dict.ContainsKey(key)){ value = dict[key];}最好这样写,可以减少一次 Hash 次数。string value;if (dict.TryGetVal原创 2021-03-29 22:22:44 · 62 阅读 · 0 评论 -
高质量代码之泛型
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~泛型的优点:可重用类型安全效率高class MyList<T>{ T[] items;}有这样一个泛型类,可以实现不同类型的代码复用。把 T 当做一个占位符,在 C# 泛型编译生成的 IL 代码中,T 就是一个占位符的角色。在实际运行中,即时编译器(JIT)会用实际代码中输入 T 类型来代替 T,即 List<int> 和 List<s原创 2021-03-29 22:22:04 · 71 阅读 · 0 评论 -
高质量代码之对象初始化
#####本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~在FCL3.5之后,存在一种更简洁有效的对象初始化机制:初始化设定项。class Person{ public string Name { get; set; } public int Age { get; set; }}//for testPerson p = new Person(){原创 2021-03-21 19:44:09 · 67 阅读 · 0 评论 -
高质量代码之foreach
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~为什么要用 foreach ?假如存在一个数组,其遍历模式可能采用依据索引来进行遍历;又存在一个HashTable,其遍历模式采用键值的形式遍历。如果根据具体的类型进行不同的编码,当需求发生变化时,客户端就会过多的修改代码。由于过多的关注了集合内部的实现,代码的可移植性就会变得很差,违反了面向对象中的开闭原则。于是,迭代器模式就产生了。先来自己实现一个迭代器:1.迭代器接口,所有迭代器全原创 2021-03-21 19:43:44 · 147 阅读 · 0 评论 -
高质量代码之集合和LINQ
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~开发过程中,c#中的集合表现为数组和若干集合类。不管是数组还是集合类,它们都有各自的优缺点。一旦在开发中使用了错误的集合或者针对集合的方法,应用程序将会原理你的预期运行。LINQ(Language Integrated Query,语言继承查询):提供了类似于SQL的语法,能够对集合进行遍历、筛选和投影。一旦掌握了LINQ,可以非常方便的进行开发,就会在以后的开发中根本离不开它。LINQ原创 2021-03-21 19:43:02 · 53 阅读 · 0 评论 -
高质量代码之对象拷贝
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~为对象创建副本的技术成为拷贝(也叫克隆)。拷贝分为两种:1.浅拷贝:将对象中的所有字段复制到新的对象中。其中值类型字段的值被复制到副本中后,在副本中修改不会影响到源对象对应的值而引用类型的字段被复制到副本中的是引用类型的引用,而不是引用得的对象,在副本中对引用类型的字段值修改会影响到源对象本身。2.深拷贝:同样将对象中的所有字段复制到新的对象中。无论是值类型还是引用类型,都会被重新创原创 2021-03-21 19:42:29 · 64 阅读 · 0 评论 -
高质量代码之字符串
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~如何操作字符串?如何进行转型?什么是克隆?什么时候需要用HashCode?这些看似简单的问题都知道吗?字符串是很频繁使用的集中基础数据类型,使用不当很容易带来额外的性能开销。case 1:string str1 = "str1" + 9;string str2 = "str2" + 9.ToString();这两行代码看起来一样的代码,生成出来的IL代码大有不同。(关于如何原创 2021-03-21 19:42:03 · 99 阅读 · 0 评论 -
高质量代码之转型操作
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~类型转换,大部分情况下都使用Framework提供的转型方法,包括:1.使用类型转换运算符,分为隐式转换和显示转换:int i = 0;float j = 0;j = i; // 隐式转换i = (int)j; //显式转换2.重载转换运算符:public static implicit operator ClassA(ClassB b){ return new Class原创 2021-03-21 19:41:15 · 72 阅读 · 0 评论 -
高质量代码之常量
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~常量分为两种:const 和 readonly。1.const:const 是一个编译器常量,且只能修饰基元类型、枚举类型或者字符串类型。如果使用 const 原因只有一个:效率!因为经过编译器编译后,代码中引用 const 变量的地方会用 const 变量的值来代替:const int CONST_VALUE = 100;Debug.Log( CONST_VALUE );//会编译成原创 2021-03-21 19:40:41 · 92 阅读 · 0 评论 -
高质量代码之枚举
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~枚举的关键字:enum,看似简单也遇到过坑~允许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long和ulong。建议:1.使用0值作为枚举类型的默认值。enum EType{ One=1, Two=2, Three=3,}EType type = default(EType);Console.WriteLine(原创 2021-03-21 19:40:11 · 119 阅读 · 0 评论 -
高质量代码之重载
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~开发过程中,应该尽量使用微软提供给我们的语法特性。每个人都习惯了下面的代码:int a = 1;int b = 2;int sum = a + b;而不是:int a = 1;int b = 2;int sum = int.Add(a, b);so,有的时候重载时非常方便的事情。同理,我们在构建自己的类型时,需要始终考虑是否可以用于运算符重载。class Salary{原创 2021-03-21 19:39:37 · 72 阅读 · 0 评论 -
高质量代码之区别对待==和Equals
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~CLR中将“相等性”分为两种:1.值相等性:用来比较的两个变量所包含的数值相等。2.引用相等性:用来比较两个变量引用的是内存中的同一个对象。在C#中,无论是操作符“==”或者方法“Equals”,都倾向于一个原则:如果是值类型,类型的值相等就是 true。如果是引用类型,类型指向同一个对象就是 true。int i1 = 1;int i2 = 1;Console.WriteLine(原创 2021-03-21 19:37:59 · 86 阅读 · 0 评论 -
高质量代码之数组
本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~建议:在元素数量可变的情况下,不应该使用数组。在C#中,数组一旦被创建,长度就不能改变。从内存使用的角度来讲,数组在创建时被分配了一段固定长度的内存。如果数组元素是值类型,每个元素的长度等于相应的值类型的长度。如果数组元素是引用类型,则每个元素的长度为该引用类型的 System.IntPtr 的大小。注意:使用数组的时候要注意大对象问题。(大对象就是占用内存85000字节的对象,它们被分原创 2021-03-17 20:40:42 · 76 阅读 · 0 评论