委托声明与声明委托的类之间的关系是什么

时间:2018-04-27 10:26:39

标签: c# delegates

我非常好奇地知道为什么当我在程序文件中的类名后面输入一个点并且委托名称出现在类的对象名之后时,智能感知中的委托类型是可见的。考虑以下代码

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

以下图片证明了我的担忧 enter image description here

enter image description here

我真的想澄清这个概念。

2 个答案:

答案 0 :(得分:0)

像这样的委托只是一个扩展特殊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中看到的只是嵌套类型的存在,对于任何其他嵌套类型都应该这样。

答案 1 :(得分:0)

当您在类中声明委托时,您声明方法签名和委托类型的名称。例如,你知道你想从你的对象调用这个方法带有一些签名,但你不知道哪一个,所以你可以分配programmaticaly。

以下代码可以帮助您理解。

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 - delagate类型中,在您的第二张图片obj.Initdel中,您可以将字段分配给委托方法。

我希望我的回答能帮到你。