你的位置:首页 > 软件开发 > ASP.net > 编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

发布时间:2016-04-08 09:00:07
前言  本文主要来学习记录前三个建议。  建议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方法 }
编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

关于装箱拆箱的问题大家可以查看我之前的文章http://www.cnblogs.com/aehyok/p/3504449.html

而以下代码,字符串不会在运行时进行拼接,而是会在编译时直接生成一个字符串。

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]
    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;    }
编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

  结果可以得知:两者的效率都不高。不要以为前者比后者创建的字符串对象更少,事实上,两者创建的字符串对象相等,且前者进行了3次string.Contact方法调用,比后者还多了两次。

  要完成这样的运行时字符串拼接(注意:是运行时),更佳的做法是使用StringBuilder类型,代码如下所示:

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]
    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);    }
编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

 对于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();    }  }
编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

提供的就是字符串到类型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()方法

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

 

 继承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();    }  }
编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

这里上面也有添加注释,通过强制转换是可以转换成功的,但是使用as运算符是不成功的编译就不通过。

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

这里就是通过转换符进行处理的结果。

接下来我们再在Program类中添加一个方法

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]
  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();    }  }
编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

但是,即使可以使用强制转型,从效率的角度来看,也建议大家使用as进行转型。

下面再来看一下is操作符

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

原标题:编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录