2010-12-17 34 views
2

我想調用聲明類之外的部分方法。這是不允許的,因爲部分方法是隱式私有的。你不能設置一個委託指向的部分,所以我建議如下:C#:部分方法和Action,未實現的主體

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(); 
     } 
    } 

的類是緊密耦合的,他們是在一個父子關係。我希望父母有一個可以重寫的方法,以瞭解有關孩子的財產變化。我可以將事件處理程序附加到每個孩子,但是孩子已經知道其父母,因此讓孩子直接通知父母似乎是要走的路。除非父母不在乎這就是爲什麼我希望能夠實施一個部分,如果我照顧。這個問題基本上是關於編程vs性能的簡化。我知道我可以僅將事件處理程序附加到我關心的情況,但通過上面的實現,我可以生成所有部分方法,並且只在我關心時才實現部分方法。

我的問題涉及部分方法Method()未實現的時間。當Action方法被調用時,編譯器會將其優化掉,因爲它的主體是空的?如果我收到一堆這樣的Action請求,我會遭受性能損失嗎?有沒有更好的方式來獲得相同的功能?

+0

你不會得到顯着的性能影響,稱空行爲是一個相當便宜的操作。我懷疑編譯器會把這個void Action取消掉。 – 2010-12-17 00:33:06

+0

我不明白爲什麼佩佩說阿布圖表演。如果它很重要...... MEASURE IT;) – 2011-03-22 09:44:58

回答

3

每,MSDN(強調):該類的

一部分包含該方法的 簽名。可以在 相同部分或另一部分中定義可選的實現。 如果沒有提供 實現,則在編譯時刪除該方法以及對方法 的所有調用。

因此,沒有真正的罰款,因爲電話優化了。

+0

是的,但部分方法調用在一個將被調用的Action中(它不會有一個主體),因此必須涉及一些處理。 – 2010-12-17 06:24:36

+0

「行動」是一種無效的方法。處理等同於調用沒有主體的方法。我知道JIT忽略了調用空方法的調用,但即使它沒有爲「Action」執行,調用也不會以任何可衡量的方式影響性能。 – Jay 2010-12-17 13:03:19

0

您提出的不同場景之間的性能差異將是亞毫秒。我會選擇最可維護的解決方案,而不是試圖在如此低的水平上優化性能。

因此,我會選擇事件解決方案,因爲我認爲其他.NET開發人員在完成代碼之後會更熟悉解決方案,而不是您呈現的具有異國情調的部分方法方法。