C#学习记录:编写高质量代码改善整理建议1-3
string
string str1 = "str1" + 9; string str2 = "str2" + 9.ToString();
第一行代码会产生一次装箱,还有一次string的concat
而第二行代码使用ToString(),内部使用的是Number.FormatInt32
其原型为
而NumberFormatInt32是一个非托管方法,运行效率比正常c#的托管代码要高很多,所以第二行代码的效率比第一行高
至于什么是托管代码非托管代码,我引用了其他博客的一段话:
托管代码与非托管代码众所周知,我们正常编程所用的高级语言,是无法被计算机识别的。需要先将高级语言翻译为机器语言,才能被机器理解和运行。 |
简单理解就是托管代码加了一个中间层,使其可以跨平台,不过效率会降低,而非托管代码就不会产生这样的情况
所以我们编写代码秉承一个原则:尽量减少装箱拆箱
StringBuilder
StringBuilder的效率来源于预先以非托管的方式分配内存,如果没有预先定义长度,默认长度为16,不够的时候会重新分配内存,依次加16的倍数,所以如果你提前知道字符串需要的最大长度,最好预先定义好,这样就不会频繁分配内存从而带来效率的降低
2、使用默认转型方法
这个建议的大体内容是尽量使用系统所带的转换类型的方法
例如 int.Parse ToString() System.Convert 等等
3、区别对待强转类型和as is
两个类型之间转换有两种情况
1. 他们是父子类的关系: ChildType = (ChildType)ParentType
2.没有继承关系,或者继承同一个父类,这时候就需要重写强转方法
class FirstType { public string Name { get; set; } } class SecondType { public string Name { get; set; } public static explicit operator SecondType(FirstType firstType) { SecondType secondType = new SecondType() { Name = firstType.Name }; return secondType; } } FirstType firstType = new FirstType() { Name = "张" }; SecondType secondType = (SecondType)firstType;
如果是继承的关系,为了效率推荐使用 ChildType = ParentType as ChildType
这个就更上面提到的,尽量使用系统方法的转换,而不是强制转换
我写Unity的时候有这样一个需求,右键点击装备的时候会使用,装备有Equipment,Weapon,我们需要判断是Equipment还是Weapon类型,它们都是继承Item类型,有两种方法可用:
Weapon weapon = item as Weapon; if(weapon != null) { //TODO 使用武器 } if(item is Weapon) { weapon weapon = item as Weapon; //TODO 使用武器 }
第一种方法只判断了一次类型,而第二种方法判断了两次类型
书上说as不能判断基元类型,但是经过我的测试发现书上写错了,as仅仅不能判断值类型,这里大家可以自己测试一下
相关文章:
以上就是C#学习记录:编写高质量代码改善整理建议1-3的详细内容,更多请关注其它相关文章!
推荐阅读
-
编写高质量代码改善C#程序——使用泛型集合代替非泛型集合(建议20)
-
C#程序编写高质量代码改善的157个建议【10-12】[创建对象时需要考虑是否实现比较器、区别对待==和Equals]
-
C#程序编写高质量代码改善的157个建议【4-9】[TryParse比Parse、使用int?来确保值类型也可以为null、readonly和const、0值设为枚举的默认值、避免给枚举类型的元素提供显式的值、习惯重载运算符]
-
C#程序编写高质量代码改善的157个建议【13-15】[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
-
C#程序编写高质量代码改善的157个建议【20-22】[泛型集合、选择集合、集合的安全]
-
C#程序编写高质量代码改善的157个建议【16-19】[动态数组、循环遍历、对象集合初始化]
-
C#学习记录:编写高质量代码改善整理建议9-15
-
C#学习记录:编写高质量代码改善整理建议4-8
-
C#学习记录:编写高质量代码改善整理建议1-3
-
C#学习记录:编写高质量代码改善整理建议4-8