/'內嵌類定義'(你在前面已經說明)Java的相當整潔的 '接口的在線實現' 也不是C#的一部分。
您可能繼續前進,實現監聽器接口/類,並將其傳遞到對象,這實際上是同樣的事情 - 然而,這可以得到相當詳細的速度非常快,而且很多時候你真的只需要提供一個單一的無論如何回調。
C#有兩個有用的工具,使生活變得更加簡單:
- 代表
- 活動
代表
這是有道理的看着活動之前,瞭解代表。 A Delegate是一種將方法作爲變量或參數傳遞的簡便方法。
可以定義委託類型(如果你願意的話):
public delegate void AMethodThatHandlesAnInteger(int theInt);
,然後用它們作爲參數的方法:
public void doStuffAndThenCallADelegate(AMethodThatHandlesAnInteger theDelegate)
{
...
theDelegate(4);
}
或者,往往不是,它更容易使用一個已經存在的預定義的代表:
public void doStuffAndThenCallADelegate(Action<int> theDelegate)
{
...
theDelegate(4);
}
Delegates can be generic - 這使得它們成爲非常強大的工具。
有一些delegates defined by the framework,(如列舉的方便Q &一個鏈接到)。我經常發現使用Action
自己(無效的方法,不帶參數),並Action<Something>
(無效的方法,接受一個參數)在簡單情況。
Func<Something,Else>
允許返回類型,並且它從那裏變得更有趣! Actions和Funcs允許0-4個參數(不包括Func的返回類型)。
活動
雖然有可能建立自己的模式使用委託對象的變化進行監測,C#更進了一步,併爲您提供現成的事件......
Events是一個非常便於對象整理'處理程序'委託方法,然後用一組參數調用它們。
首先定義委託類型的「處理」的方法:
public delegate void StuffHappenedHandler(int stuffs, string summary);
然後通過定義一個公共事件,您可以爲代表註冊/註銷一個到達現場。我有時前綴我的活動與「開」 - 它是代碼的造型問題:
public event StuffHappenedHandler OnStuff;
是希望監控此事件的對象需要的StuffHappenedHandler
委託類型簽名匹配方法:
public void MonitoredObjectStuffHandler(int howMany, string summary)
{
...
}
現在,它可以註冊與OnStuff
事件方法:
monitoredObject.OnStuff += ObjectStuffHandler;
從事件中註銷的委託方法,它只是簡單:
monitoredObject.OnStuff -= ObjectStuffHandler;
當涉及到通知可能正在偵聽的對象時,檢查空事件很重要。本次活動將是空的,如果沒有什麼註冊:
if (OnStuff != null)
OnStuff(4, "four things");
我想你使用回調給一個方法作爲參數傳遞給另一個。在C#中,這些代碼是用來代替的。 –