簡體   English   中英

一個類中的委托是什么意思?

[英]What is the meaning of a delegate inside a class?

我理解委托是用一種方法定義一個類的快捷方式,但下面的bar2是什么意思? 它匯編。 但我看不出內心階級會做什么。 我知道我錯過了什么,這就是為什么我要問(這不是作業,我現在正在工作)。

namespace ns2 { public delegate void bar();}
public class foo
{
    private ns2.bar _callback;
    public foo(ns2.bar callback) { _callback = callback; }
    public void baz() { _callback(); }
    public delegate void bar2();
}

謝謝!

為了添加Jon和Jared的答案,我注意到你通常在一個類中定義一個委托的唯一時間是委托是該類的私有實現細節。 在類中包含公共委托定義是罕見且奇怪的。

例如,考慮我最喜歡的模式:一個抽象基類,只能通過使用工廠制造的私有嵌套類進行擴展:

public abstract class Animal
{
    private Animal() { } // prevents subclassing from outside!
    private sealed class Giraffe : Animal { }
    private sealed class Leopard : Animal { }
    public static Animal GetGiraffe( ) { return new Giraffe(); }
    public static Animal GetLeopard( ) { return new Leopard(); }

假設Animal的實現細節是你需要一個從長頸鹿到Leopard的代表:

    private delegate Leopard D(Giraffe g);

這不能是公共委托類,因為它引用了私有類型!

現在你當然不會這樣做。 你會使用Func<Giraffe, Leopard>而且你已經完成了。

因此,嵌套委托類型幾乎就是為了完整性和向后兼容性; 通常你不會使用它。

委托不是使用一種方法定義類的快捷方式。 實際上它們至少有6個方法(Invoke,BeginInvoke,EndInvoke,GetHashCode,Equals,ToString)。

將委托放在類型中的模式的一個原因是避免全局命名空間污染。 代表bar2只能通過foo的限定引用訪問。 如果bar2是具有多個有效bar2的名稱並且將其置於foo內提供必要的上下文,則這可能是有價值的。

它只是聲明一個嵌套類型,就是這樣。 因為它是公開的,所以在類型內聲明和在外面聲明之間幾乎沒有區別。

其他類必須通過包含類型的名稱引用它(除非它們具有專門用於它的using指令):

public class OtherClass
{
    private void DoSomething()
    {
        foo.bar2 action = delegate { ... };
        foo f = new foo(action);
        ...
    }
}

通常當我編寫嵌套類型時,它是私有的 - 它只是包含類的輔助類; 一個實現細節。 當然,情況並非必須如此,但至少應該是嵌套類型沒有意義,除非你以某種方式使用外部類。 例如,它可以是外部類的構建器,也可以是外部類中方法調用的某些參數中使用的枚舉。

(順便說一句,在編寫像這樣的示例代碼時,即使對於FooBar這樣的元語法名稱,它也很有用。例如,它使變量和類型之間的區別更加清晰。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM