Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 优化C中的空方法调用_C#_Optimization_Abstract_Method Call - Fatal编程技术网

C# 优化C中的空方法调用

C# 优化C中的空方法调用,c#,optimization,abstract,method-call,C#,Optimization,Abstract,Method Call,我有一个抽象类,它应该成为一个庞大的类层次结构的基础。除此之外,它还有某种抽象的方法。在执行过程中,只知道这个抽象类而不知道它的子类的系统会不断调用这个类的所有对象: foreach( AbstractClass object in allTheObjects ) object.DoStuff(); 然而,它的很多子类实际上并没有重写这个基类中为空的方法;使用它的和不使用它的都分布在类层次结构中。C会处理这个空方法吗,还是我必须以某种方式对它进行优化 旁白:我知道过早优

我有一个抽象类,它应该成为一个庞大的类层次结构的基础。除此之外,它还有某种抽象的方法。在执行过程中,只知道这个抽象类而不知道它的子类的系统会不断调用这个类的所有对象:

    foreach( AbstractClass object in allTheObjects )
        object.DoStuff();
然而,它的很多子类实际上并没有重写这个基类中为空的方法;使用它的和不使用它的都分布在类层次结构中。C会处理这个空方法吗,还是我必须以某种方式对它进行优化


旁白:我知道过早优化是有害的,但这让我很好奇。

我不担心这一点。在C语言中,方法调用非常便宜。即使你选择这个,我怀疑你会看到任何不同。参考请参阅帖子

我更担心的是,你是否能避免遍历所有对象,或者所有对象的数据结构是什么。我要说的是,那里有更多的优化潜力

您还可以考虑是否真的需要一个大的继承结构,或者是否可以通过组合或接口实现您的目标


您还将发现更多的信息接口方法与委托相比与普通方法调用相比

我不担心这一点。在C语言中,方法调用非常便宜。即使你选择这个,我怀疑你会看到任何不同。参考请参阅帖子

我更担心的是,你是否能避免遍历所有对象,或者所有对象的数据结构是什么。我要说的是,那里有更多的优化潜力

您还可以考虑是否真的需要一个大的继承结构,或者是否可以通过组合或接口实现您的目标

您还将发现更多信息接口方法与委托、普通方法调用的对比

然而,它的很多孩子实际上都会有这个空方法

也许你需要将这个方法声明为虚拟的而不是抽象的?因此,您可以提供默认的空实现

然而,它的很多孩子实际上都会有这个空方法


也许你需要将这个方法声明为虚拟的而不是抽象的?因此,您可以提供默认的空实现。

优化是什么意思?如何优化一个什么都不做的方法?然而,它的许多子级实际上会将此方法设置为空,忽略可能的性能考虑,这并不表示对您的设计有好处。如果可以的话,在这里你可能更喜欢组合而不是继承。@golergka调用一个什么都不做的方法对计算机来说是非常快的。即使做几千次也不会花很长时间。您可能希望改进设计,使其更易于理解和使用,但不需要提高速度。只需调用空方法,然后检查它是否已实现,速度会更快。即使您在每个被重写和实现的对象上都有一个名为CanCallDoStuff的属性,并且在调用该方法之前检查了该属性,也不会有任何区别。如果您可以通过保留一个单独的项集合来减少枚举的大小,而这些项确实实现了该方法,并在此基础上进行枚举,那么如果您经常枚举并且很少修改该集合,这可能是值得的。但正如你自己所说,最有可能是过早优化。你说的优化是什么意思?你如何优化一个什么都不做的方法?然而,事实上,它的很多孩子会忽略可能的性能考虑而将此方法置诸脑后,这并不意味着对你的设计有好处。如果可以的话,在这里你可能更喜欢组合而不是继承。@golergka调用一个什么都不做的方法对计算机来说是非常快的。即使做几千次也不会花很长时间。您可能希望改进设计,使其更易于理解和使用,但不需要提高速度。只需调用空方法,然后检查它是否已实现,速度会更快。即使您在每个被重写和实现的对象上都有一个名为CanCallDoStuff的属性,并且在调用该方法之前检查了该属性,也不会有任何区别。如果您可以通过保留一个单独的项集合来减少枚举的大小,而这些项确实实现了该方法,并在此基础上进行枚举,那么如果您经常枚举并且很少修改该集合,这可能是值得的。但正如你自己所说,最有可能是过早优化。在C语言中,方法调用真的很便宜,这到底是什么意思。?与其他语言的昂贵相比?这意味着它们并不昂贵,因此您不必担心调用它们或将大型语言重构为两种。@BigM这意味着LueTm不能代表现有的所有其他语言,他只能代表C或只选择代表C,这既是与此相关的,也是他在这方面的经验。@Servy
,我想我的困惑是,什么时候在任何语言中调用空方法都会很昂贵?@LueTm,请看我对Servy的评论。在C中,方法调用真的很便宜,这到底是什么意思。?与其他语言的昂贵相比?这意味着它们并不昂贵,因此您不必担心调用它们或将大型语言重构为两种。@BigM这意味着LueTm不能代表现有的所有其他语言,他只能代表C或只选择代表C,这是与此相关的内容,也是他在这方面的经验。@Servy,我想我的困惑是,在任何语言中调用空方法的代价是什么?@LueTm,请看我对Servy的评论。这就是我的意思,我不知道为什么我没有澄清这一点。但是调用的是同一个空方法,所以它在哪里声明没有什么区别,对吗?@golergka:基础上的空虚拟方法只是消除了对抽象方法的空实现的需要。这就是我所做的,我只是一开始没有澄清。这就是我的意思,我不知道为什么我没有澄清这一点。但是调用的是同一个空方法,所以它在何处声明并不重要,对吗?@golergka:基础上的空虚拟方法只是消除了对抽象方法的空实现的需要。这就是我所做的,我只是一开始没有澄清它。