簡體   English   中英

委托聲明和聲明委托的類之間的關系是什么

[英]what is the relation between delegate declaration and the class in which the delegate is declared

我很好奇,為什么我在程序文件中的類名之后鍵入點並在類的對象名之后出現委托名稱時,為什么在智能感知中可以看到委托類型。
考慮以下代碼

public class DelDec
{
    public delegate void Initdel(String s);
    public Initdel Init;
}

如果我在另一個課程中有一個實例方法

public class Methoddef
{
    public void process(string s)
    {
        Console.WriteLine("The message passed is" + s);
    }
}

現在,當

class Program
{
    static void Main(string[] args)
    {
        Methoddef md=new Methoddef();
        DelDec.Initdel d = md.process;
    }
}  

下圖顯示了我的關注 在此處輸入圖片說明

在此處輸入圖片說明

我真的很想澄清這個概念。

這樣的委托僅僅是一個嵌套的類,它擴展了特殊的System.MulticastDelegate類型並具有運行時定義的方法。 看一下通過編譯此c#代碼產生的IL代碼:

public class C {
    public delegate void Del();
}


.class public auto ansi beforefieldinit C
    extends [mscorlib]System.Object
{
    // Nested Types
    .class nested public auto ansi sealed Del
        extends [mscorlib]System.MulticastDelegate
    {
        // Methods
        .method public hidebysig specialname rtspecialname 
            instance void .ctor (
                object 'object',
                native int 'method'
            ) runtime managed 
        {
        } // end of method Del::.ctor

        .method public hidebysig newslot virtual 
            instance void Invoke () runtime managed 
        {
        } // end of method Del::Invoke

        .method public hidebysig newslot virtual 
            instance class [mscorlib]System.IAsyncResult BeginInvoke (
                class [mscorlib]System.AsyncCallback callback,
                object 'object'
            ) runtime managed 
        {
        } // end of method Del::BeginInvoke

        .method public hidebysig newslot virtual 
            instance void EndInvoke (
                class [mscorlib]System.IAsyncResult result
            ) runtime managed 
        {
        } // end of method Del::EndInvoke

    } // end of class Del

} // end of class C

注意方法聲明中的runtime關鍵字,這意味着方法實現將由運行時本身提供。

因此,您在intellisense中看到的只是嵌套類型的存在,其他任何嵌套類型也應如此。

在類中聲明委托時,可以聲明方法簽名和委托類型的名稱。 例如,您知道要從帶有某些簽名的對象中調用此方法,但是您不知道哪個簽名,因此可以對其進行編程分配。

這是可以幫助您理解的代碼。

class Program
{
    static void Main(string[] args)
    {
        Methoddef md=new Methoddef();
        DelDec.Initdel d = md.process; //you create variable of delegate type Initdel and asign this variable

        var obj = new DelDec();
        obj.Init = d; //assign delegate to class instance

        obj.Init("Test");

    }

    public class DelDec
    {
        //Declares a delegate for a void method that takes an string parameter.
        public delegate void Initdel(String s);
        public Initdel Init;
    }


    public class Methoddef
    {
        public void process(string s)
        {
            Console.WriteLine("The message passed is " + s);
        }
    }
}

如果您閱讀此https://msdn.microsoft.com/ru-ru/library/system.delegate(v=vs.110).aspx,也很好

因此,在您的第一張圖片DelDec.Initdel -滯后類型,在第二張圖片obj.Initdel ,您可以在此字段中分配come方法來進行委派。

希望我的回答對您有所幫助。

暫無
暫無

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

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