首先回答你的问题:类转换为基类,或基类(包含相关类的强类型)转换为相应类,都会有性能的损耗。但是我感觉这种损失在大多数的情况是可以忽略不计的,除非你是写通讯类的应用或是对性能要求极高的程序才需要考虑。比如说以下代码:    int x=5;
    object obj=x;
    int y=(int) obj;
上面的代码纯演示,请不要考虑它有何意义。从性能的角度来说其产生了装箱,拆箱操作操作,好像影响了性能。但是,如果只是针对企业应用,个人感觉这方面是不要做过多考虑的。比如你在做一个企业零售商店的进货流程,采购下单-供应商回签合同交期-企业收货这种流程往往很复杂,而且可以把流程做大量优化,比如以前的一个采购流程说不定要走10天,经过优化后只要5天,这样节省了5天的时间,而你的代码再怎么优化,也最多节约几秒钟的时间。

解决方案 »

  1.   

    没有办法将子类“转换”成父类。所谓的“转换”,只是让编译器“视作”父类类型。因此根本没有任何开销。当然这里有个例外,就是值类型,当它强制转换为object的时候,会发生装箱。
      

  2.   


    不考虑装箱,拆箱操作,只说引用类型。“视作”父类型,为何没有开销?二楼说:“类型转换至少需要类型判定操作,虚方法或者接口方法调用需要多一次地址跳转。”,
    那么除了必须用base.虚方法外,直接用this.方法。引用父类的方法不行吗,为何非要先转成父类或者接口类?
      

  3.   


    不是说做优化,而是.net框架里有大量的转化为接口类或父类的调用方法,必须要这样做吗?
      

  4.   


    不考虑装箱,拆箱操作,只说引用类型。“视作”父类型,为何没有开销?二楼说:“类型转换至少需要类型判定操作,虚方法或者接口方法调用需要多一次地址跳转。”,
    那么除了必须用base.虚方法外,直接用this.方法。引用父类的方法不行吗,为何非要先转成父类或者接口类?因为这是编译器干的事情。不会在运行的时候有开销。
      

  5.   


    没太明白你的意思。 直接用this.接口方法()     和  ((接口)this).接口方法()   之间到底有什么性能上区别?
      

  6.   


    从基础类型的定义来看,他们都没有显示从Object类派生,比如
    public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
    所以,我感觉任何类(就是说说引用类型,值类型就不讨论了)转换成Object亦需要一定的系统开销,当然可能比值类型的装箱拆箱小一点。
      

  7.   


    所以,比如上面的String定义,如果转换成Object无开销,那么它就不必实现泛型接口了
      

  8.   

    this.XXX()目标地址是直接确定的,接口.XXX()目标地址是不确定的,需要JIT为每个类型生成一个查询表。所有class都是继承自object,不需要显示定义。
    任何class类型转换成object的开销仅仅是绑定类型(一个赋值操作而已),如果是及时使用的话就会被内联优化。这句话没看明白你要说什么,转换成object与泛型接口有什么关系?
      

  9.   

    知道你说的什么了。IEnumerable<char>不用说避免了object与char的装拆箱操作。IComparable<string>你看看源码就明白了,比如
    public int CompareTo(object value)
    {
        if (value == null)
        {
            return 1;
        }
        if (!(value is string))
        {
            throw new ArgumentException(Environment.GetResourceString("Arg_MustBeString"));
        }
        return Compare(this, (string) value, StringComparison.CurrentCulture);
    }public int CompareTo(string strB)
    {
        if (strB == null)
        {
            return 1;
        }
        return CultureInfo.CurrentCulture.CompareInfo.Compare(this, strB, CompareOptions.None);
    }虽然没有IEquatable,如果有的话和IComparable是一样的问题。
      

  10.   

    有影响,难道楼主你觉得转换与不转换,都什么也没变,都一个样?不可能!不过不明显罢了,你看ildasm.exe,会发现派生类会被标识扩展于哪个基类,这些标识在转换操作时有用,那么,你转换语句给它,先不说栈里的地址指向有无变化,就单讲去验证类型的兼容性,多少得花些时间。为毛一想到性能影响,就只想到大家都知道的像装箱与拆箱这种因栈和堆变更,在我看来,写的代码不一样,害得编译器多生成几行CIL,都算是受影响的,只是影响的大小不同罢了。当然,谁都希望这样做不受影响,但多态这玩意,真心好用实用,不能放弃
      

  11.   

    求高人解答直接用this.接口方法()   和  ((接口)this).接口方法()之间到底有什么性能上区别? 后者的用法有什么优点?
      

  12.   


    同意。
    实际上,直接this.接口方法();编译器有没有隐式执行((接口)this)这一步操作,还有得研究
    微软隐藏了太多东东,比如,自定义类时,表面上没有继承任何基类,结果,编译器自动加上objectpublic ClassA : object {}
      

  13.   

    .net 框架里的类库有大量这样的用法,都是先转成接口类再调用接口方法。