2010-12-17 7 views
2

私は宣言クラスの外側から部分的メソッドを呼び出したいです。部分的なメソッドは暗黙的にプライベートであるため、これは許可されていません。あなたはので、私は次のことを提案しています部分を指すようにデリゲートを設定することはできません。C#の:部分的な方法とアクション、非実装体

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メソッドが呼び出されると、コンパイラはボディが空であるため、それを最適化しますか?私がこれらのアクションコールのヒープを取得した場合、私はパフォーマンスのペナルティを受けることができますか?同じ機能を使用するより良い方法はありますか?

+0

あなたは空のアクションはかなり安い操作で呼び出して、顕著なパフォーマンスヒットを取得するつもりはありません。私は、コンパイラがvoid Actionを取り除くことは疑う。 –

+0

私はpeopeがabotuのパフォーマンスを話す理由を知りません。それが問題の場合... MEASURE IT;) –

答えて

3

PERが、MSDN(強調追加):クラスの

一部は方法の 署名を含みます。オプションの の実装は、同じ部品または別の部品の に定義することができます。 実装が供給されない場合、方法 の方法およびすべての呼び出しは、コンパイル時に除去されます。

したがって、コールが最適化されるため、実際のペナルティはありません。

+0

はい、部分メソッド呼び出しは呼び出されるアクションの中にあります(ボディはありません)ので、何らかの処理が必要です。 –

+0

'Action'はvoidメソッドです。この処理は、本文のないメソッドを呼び出すのと同じです。私はJITが空のメソッドへの呼び出しを省略していることを知っていますが、たとえ「アクション」のためにそうしていなくても、呼び出しは測定可能な方法でパフォーマンスに影響を与えません。 – Jay

0

あなたが提案するさまざまなシナリオの性能差は、サブミリ秒になります。私はそのような低レベルでパフォーマンスを最適化しようとするよりも、最も保守的な解決策をとるでしょう。

私はあなたが提示する解決策ではなく、エキゾチックな部分メソッドのアプローチに慣れだろう後のコードでは動作し、他の.NET開発者を思うのでだから、私は、イベントのソリューションとなるだろう。

関連する問題