首先回答你的问题:类转换为基类,或基类(包含相关类的强类型)转换为相应类,都会有性能的损耗。但是我感觉这种损失在大多数的情况是可以忽略不计的,除非你是写通讯类的应用或是对性能要求极高的程序才需要考虑。比如说以下代码: int x=5;
object obj=x;
int y=(int) obj;
上面的代码纯演示,请不要考虑它有何意义。从性能的角度来说其产生了装箱,拆箱操作操作,好像影响了性能。但是,如果只是针对企业应用,个人感觉这方面是不要做过多考虑的。比如你在做一个企业零售商店的进货流程,采购下单-供应商回签合同交期-企业收货这种流程往往很复杂,而且可以把流程做大量优化,比如以前的一个采购流程说不定要走10天,经过优化后只要5天,这样节省了5天的时间,而你的代码再怎么优化,也最多节约几秒钟的时间。
object obj=x;
int y=(int) obj;
上面的代码纯演示,请不要考虑它有何意义。从性能的角度来说其产生了装箱,拆箱操作操作,好像影响了性能。但是,如果只是针对企业应用,个人感觉这方面是不要做过多考虑的。比如你在做一个企业零售商店的进货流程,采购下单-供应商回签合同交期-企业收货这种流程往往很复杂,而且可以把流程做大量优化,比如以前的一个采购流程说不定要走10天,经过优化后只要5天,这样节省了5天的时间,而你的代码再怎么优化,也最多节约几秒钟的时间。
不考虑装箱,拆箱操作,只说引用类型。“视作”父类型,为何没有开销?二楼说:“类型转换至少需要类型判定操作,虚方法或者接口方法调用需要多一次地址跳转。”,
那么除了必须用base.虚方法外,直接用this.方法。引用父类的方法不行吗,为何非要先转成父类或者接口类?
不是说做优化,而是.net框架里有大量的转化为接口类或父类的调用方法,必须要这样做吗?
不考虑装箱,拆箱操作,只说引用类型。“视作”父类型,为何没有开销?二楼说:“类型转换至少需要类型判定操作,虚方法或者接口方法调用需要多一次地址跳转。”,
那么除了必须用base.虚方法外,直接用this.方法。引用父类的方法不行吗,为何非要先转成父类或者接口类?因为这是编译器干的事情。不会在运行的时候有开销。
没太明白你的意思。 直接用this.接口方法() 和 ((接口)this).接口方法() 之间到底有什么性能上区别?
从基础类型的定义来看,他们都没有显示从Object类派生,比如
public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
所以,我感觉任何类(就是说说引用类型,值类型就不讨论了)转换成Object亦需要一定的系统开销,当然可能比值类型的装箱拆箱小一点。
所以,比如上面的String定义,如果转换成Object无开销,那么它就不必实现泛型接口了
任何class类型转换成object的开销仅仅是绑定类型(一个赋值操作而已),如果是及时使用的话就会被内联优化。这句话没看明白你要说什么,转换成object与泛型接口有什么关系?
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是一样的问题。
同意。
实际上,直接this.接口方法();编译器有没有隐式执行((接口)this)这一步操作,还有得研究
微软隐藏了太多东东,比如,自定义类时,表面上没有继承任何基类,结果,编译器自动加上objectpublic ClassA : object {}