Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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#_Action_Partial_Anonymous Methods - Fatal编程技术网

C#:部分方法和行动,非执行机构

C#:部分方法和行动,非执行机构,c#,action,partial,anonymous-methods,C#,Action,Partial,Anonymous Methods,我想从声明类的外部调用分部方法。这是不允许的,因为分部方法是隐式私有的。您不能将委托设置为指向分部,因此我建议如下: public partial class MyClass { AnotherClass _anotherClass; public MyClass () { _anotherClass = new AnotherClass(); _anotherClass.Method = new Action(() =&g

我想从声明类的外部调用分部方法。这是不允许的,因为分部方法是隐式私有的。您不能将委托设置为指向分部,因此我建议如下:

  public partial class MyClass  {

      AnotherClass _anotherClass;

      public MyClass  () {
         _anotherClass = new AnotherClass();
         _anotherClass.Method = new Action(() => {            
            this.Method(); 
         });
      }

      partial void Method();

      //sometimes this method will be implemented
      //partial void Method() {
         //do something
      //}
   }

   public class AnotherClass {

      public Action Method { get; set;}

      public void SomeOtherMethod(){
         this.Method();
      }
   }
这些类是紧密耦合的,它们处于父子关系中。我希望父对象有一个可以重写的方法,以了解子对象的属性更改。我可以将事件处理程序附加到每个孩子身上,但是孩子已经知道自己的父母,因此让孩子直接通知父母似乎是一种方法。除非父级不关心,这就是为什么我希望在我关心的情况下能够实现部分。这个问题基本上是关于编程的易用性和性能。我知道我只能将事件处理程序附加到我关心的情况,但是通过上面的实现,我可以生成所有的分部方法,并且只有在我关心的情况下才能实现分部

我的问题涉及部分方法
method()
未实现的时间。当调用Action方法时,编译器是否会在其主体为空时对其进行优化?如果我收到一堆这样的动作调用,我会受到性能惩罚吗?有没有更好的方法来获得相同的功能?

Per,(强调添加):

类的一部分包含 方法的签名。可选的 可在中定义实现 同一部分或另一部分如果 那么,没有提供实现 方法以及对该方法的所有调用 在编译时被删除。


因此,当调用被优化掉时,没有真正的损失。

您提出的不同场景之间的性能差异将是亚毫秒。我会选择最具可维护性的解决方案,而不是尝试在如此低的级别上优化性能


因此,我会选择事件解决方案,因为我认为在您之后处理代码的其他.NET开发人员会更熟悉该解决方案,而不是您介绍的奇特的部分方法。

您不会得到明显的性能影响,调用空操作是一种非常廉价的操作。我怀疑编译器是否会删除无效操作。我不明白为什么人们谈论性能。如果有关系的话。。。测量它;)是的,但是分部方法调用在将被调用的操作中(它只是没有主体),因此必须涉及一些处理。
操作
是无效方法。处理相当于调用一个没有主体的方法。我知道JIT忽略了对空方法的调用,但即使它没有对“操作”这样做,调用也不会以任何可测量的方式影响性能。