派生类、参数和性能

本文关键字:性能 参数 派生 | 更新日期: 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对象的方法,则不需要强制转换,也不应该这样做。

其次,它只会向任何一个方向传递指针,因此它将以相同的速度运行。唯一的开销是通过派生类中额外数据的大小来调整指针;显然,这并不是一个可以测量的速度差异。