前言 本文主要来学习记录前三个建议。 建议1、正确操作字符串 建议2、使用默认转型方法 建议3、区别对待强制转换与as和is其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正。建议1、正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型。如 ...
前言
本文主要来学习记录前三个建议。
建议1、正确操作字符串
建议2、使用默认转型方法
建议3、区别对待强制转换与as和is
其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正。
建议1、正确操作字符串
字符串应该是所有编程语言中使用最频繁的一种基础数据类型。如果使用不慎,我们就会为一次字符串的操作所带来的额外性能开销而付出代价。本条建议将从两个方面来探讨如何规避这类性能开销:
1、确保尽量少的装箱
2、避免分配额外的内存空间
先来介绍第一个方面,请看下面的两行代码:
String str1="str1"+9;String str2="str2"+9.ToString();
private static void NewMethod1(){ get='_blank'>string s1="abc"; s1="123"+s1+"456"; ////以上两行代码创建了3个字符串对象对象,并执行了一次string.Contact方法 }private static void NewMethod2(){ string re=9+"456"; ////该方法发生了一次装箱,并调用一次string.Contact方法 }
关于装箱拆箱的问题大家可以查看我之前的文章http://www.cnblogs.com/aehyok/p/3504449.html
而以下代码,字符串不会在运行时进行拼接,而是会在编译时直接生成一个字符串。
private static void NewMethod1() { string a = "t"; a += "e"; a += "s"; a += "t"; } private static void NewMethod2() { string a = "t"; string b = "e"; string c = "s"; string d = "t"; string result = a + b + c + d; }
结果可以得知:两者的效率都不高。不要以为前者比后者创建的字符串对象更少,事实上,两者创建的字符串对象相等,且前者进行了3次string.Contact方法调用,比后者还多了两次。
要完成这样的运行时字符串拼接(注意:是运行时),更佳的做法是使用StringBuilder类型,代码如下所示:
public static void NewMethod4() { string a = "t"; string b = "e"; string c = "s"; string d = "t"; string result = string.Format("{0}{1}{2}{3}", a, b, c, d); }
对于String和StringBuilder的简单介绍也可以参考我之前的一篇文章http://www.cnblogs.com/aehyok/p/3505000.html
建议2、使用默认转型方法
1、使用类型的转换运算符,其实就是使用类型内部的一方方法(即函数)。转换运算符分为两类:隐式转换和显式转换(强制转换)。基元类型普遍都提供了转换运算符。
所谓“基元类型”,是指编译器直接支持的数据类型。基元类型包括:sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool、decimal、object、string。
int i = 0; float j = 0; j = i; ///int 到float存在一个隐式转换 i = (int)j; ///float到int必须存在一个显式转换
public class Ip { IPAddress value; public Ip(string ip) { value = IPAddress.Parse(ip); } //重载转换运算符,implicit 关键字用于声明隐式的用户定义类型转换运算符。 public static implicit operator Ip(string ip) { Ip iptemp = new Ip(ip); return iptemp; } //重写ToString方法 public override string ToString() { return value.ToString(); } } class Program { public static void Main(string[] args) { Ip ip = "192.168.1.1"; //通过Ip类的重载转换运算符,实现字符串到Ip类型的隐式转换 Console.WriteLine(ip.ToString()); Console.ReadLine(); } }
提供的就是字符串到类型Ip之间的隐式转换。
2、使用类型内置的Parse、TryParse,或者如ToString、ToDouble、ToDateTime等方法
比如从string转换为int,因为其经常发生,所以int本身就提供了Parse和TryParse方法。一般情况下,如果要对某类型进行转换操作,建议先查阅该类型的API文档。
3、使用帮助类提供的方法
可以使用System.Convert类、System.BitConverter类来进行类型的转换。
System.Convert提供了将一个基元类型转换为其他基元类型的方法,如ToChar、ToBoolean方法等。值得注意的是,System.Convert还支持将任何自定义类型转换为任何基元类型,只要自定义类型继承了IConvertible接口就可以。如上文中的IP类,如果将Ip转换为string,除了重写Object的ToString方法外,还可以实现IConvertible的ToString()方法
继承IConvertible接口必须同时实现其他转型方法,如上文的ToBoolean、ToByte,如果不支持此类转型,则应该抛出一个InvalidCastException,而不是一个NotImplementedException。
4、使用CLR支持的转型
CLR支持的转型,即上溯转型和下溯转型。这个概念首先是在Java中提出来的,实际上就是基类和子类之间的相互转换。
就比如: 动作Animal类、Dog类继承Animal类、Cat类也继承自Amimal类。在进行子类向基类转型的时候支持隐式转换,如Dog显然就是一个Animal;而当Animal转型为Dog的时候,必须是显式转换,因为Animal还可能是一个Cat。
Animal animal = new Animal(); Dog dog = new Dog(); animal = dog; /////隐式转换,因为Dog就是Animal ///dog=animal; ////编译不通过 dog = (dog)animal; /////必须存在一个显式转换
public class FirstType { public string Name { get; set; } } public class SecondType { public string Name { get; set; } public static explicit operator SecondType(FirstType firstType) { SecondType secondType = new SecondType() { Name = "转型自:" + firstType.Name }; return secondType; } } class Program { static void Main(string[] args) { FirstType firstType = new FirstType() { Name="First Type"}; SecondType secondType = (SecondType)firstType; ///此转换是成功的 secondType = firstType as SecondType; ///编译不通过 Console.ReadLine(); } }
这里上面也有添加注释,通过强制转换是可以转换成功的,但是使用as运算符是不成功的编译就不通过。
这里就是通过转换符进行处理的结果。
接下来我们再在Program类中添加一个方法
public class FirstType { public string Name { get; set; } } public class SecondType : FirstType { } class Program { static void Main(string[] args) { SecondType secondType = new SecondType() { Name="aehyok"}; FirstType firstType = (FirstType)secondType; firstType = secondType as FirstType; Console.ReadLine(); } }
但是,即使可以使用强制转型,从效率的角度来看,也建议大家使用as进行转型。
下面再来看一下is操作符。
原标题:编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]
关键词:C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。