Какова связь между объявлением делегата и классом, в котором объявлен делегат? - PullRequest
0 голосов
/ 27 апреля 2018

Мне очень любопытно узнать, почему тип делегата отображается в intellisense, когда я набираю точку после имени класса в моем программном файле, а имя делегата появляется после имени объекта класса.
Рассмотрим следующий код

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 голосов
/ 27 апреля 2018

Вы объявляете подпись метода и имя типа делегата, когда вы объявляете делегата в классе. Например, вы знаете, что хотите вызвать этот метод из своего объекта с некоторой подписью, но не знаете, какой именно, поэтому вы можете назначить его программно.

Вот код, который может помочь вам понять.

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.

Я надеюсь, что мой ответ поможет вам.

0 голосов
/ 27 апреля 2018

Такой делегат - это просто вложенный класс, расширяющий специальный тип System.MulticastDelegate и определяемый во время выполнения методами. Взгляните на код IL, созданный путем компиляции этого кода на c #:

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, это просто наличие вложенного типа, то же самое должно произойти для любого другого вложенного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...