派生类、参数和性能
本文关键字:性能 参数 派生 | 更新日期: 2023-09-27 18:00:39
假设我设置了
class MainInfo
{
public string path{get;set;}
public string name{get;set;}
}
class MoreInfo : MainInfo
{
// more variables and methods
}
在另一个类中,我得到了MoreInfo类声明为public MoreInfo info;
在另一种方法中,我只需要MainInfo
信息,现在我想知道的是,如果我把info
传递给另一种类似于 MainInfo
的方法: (MainInfo)info
作为一个参数,而不是只传递整个info
,然后在该方法中只得到我需要的信息,会有什么性能差异吗?
谢谢!
编辑:或者,如果我传递一个类似MainInfo in = (MainInfo)info;
的参数。这三者之间有什么不同吗?
如果方法采用MainInfo
,则不需要强制转换任何继承类型,只需直接传递即可。
至于性能,这不是你可能会遇到的问题。这将是一个微观优化,几乎任何软件都会有更大的优化。
Cast有一些性能成本,但您知道:过早优化是任何开发的魔鬼。
做出设计决策,然后再进行优化。如果您的方法需要一个更具体的MoreInfo
实例,因为它需要访问整个信息,那么将向下转换的对象提供给MoreInfo
可能是一个不错的选择。如果没有,只需让对象保持原样,并键入MainInfo
即可。
选角有性能差异,但我认为这还不够大。在上面的课上做了一个测试,得到了2218个没有施法的刻度和135个有施法的记号。我相信这是因为它在编译时处理强制转换。希望这能有所帮助!
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
testmethod(info);
watch.Stop();
Console.WriteLine(watch.ElapsedTicks); // 2218 ticks
watch.Restart();
testmethod((MainInfo)info);
watch.Stop();
Console.WriteLine(watch.ElapsedTicks); // 135 ticks
首先,如果您将MoreInfo对象传递给一个期望MainInfo对象的方法,则不需要强制转换,也不应该这样做。
其次,它只会向任何一个方向传递指针,因此它将以相同的速度运行。唯一的开销是通过派生类中额外数据的大小来调整指针;显然,这并不是一个可以测量的速度差异。