почему функция, добавленная к делегату, должна быть статической? - PullRequest
0 голосов
/ 21 марта 2012

Я объявил делегата:

public delegate void Del(string message);

Затем я создал функцию, которую я хочу добавить к делегату:

public static void DelegateMethod(string message)
{
    System.Console.WriteLine(message);
}

Теперь я добавляю функцию к делегату и вызываюit:

Del handler = new Del( DelegateMethod);
handler("Hello World");
Console.Read();

Почему, когда я удаляю static из DelegateMethod, я получаю ошибку?

Почему делегируемая мной функция должна быть статической?

Ответы [ 5 ]

3 голосов
/ 21 марта 2012

почему, когда я отбрасываю "static" из DelegateMethod, я получаю ошибку?

Потому что вы пишете этот код внутри статического метода.Учитывая тот факт, что вы используете Console.Read, я предполагаю, что вы поместили этот код в метод static void Main вашего консольного приложения.Если вы хотите удалить ключевое слово static из метода, вам потребуется экземпляр класса, содержащий этот метод.Как это:

class Program
{
    public delegate void Del(string message);

    public void DelegateMethod(string message)
    {
        System.Console.WriteLine(message);
    }

    static void Main()
    {
        Del handler = new Del(new Program().DelegateMethod);
        handler("Hello World");
        Console.Read();
    }
}
1 голос
/ 21 марта 2012

почему, когда я отбрасываю "static" из DelegateMethod, я получаю ошибку?

Вы не указали точно, по какой ошибке вы запутались. Я подозреваю, что ошибка, которая вас смущает, заключается в том, что эта строка не скомпилируется, если DelegateMethod не static и вы пишете строку кода в методе static в содержащем классе:

Del handler = new Del( DelegateMethod); 

Причина этого в том, что если вы не объявите DelegateMethod как static, то вам нужен экземпляр для ссылки на метод. Учитывая, что ваш код, вероятно, записывается в методе static для содержащего класса, не существует неявного this, и поэтому вам необходим явный экземпляр. Предполагая, что ваш содержащий класс называется Foo:

Foo foo = new Foo();
Del handler = ne Del(foo.DelegateMethod);

См

1 голос
/ 21 марта 2012

Он не должен быть статическим, но нестатическому методу нужен экземпляр. Это само определение нестатического (экземпляра) метода. Вы можете передать метод экземпляра (и экземпляр) делегату следующим образом:

Del handler = new Del(instanceVariable.DelegateMethod);

Вы можете добавить методы экземпляра к делегату в другом методе экземпляра того же класса. Предполагается, что это экземпляр.

Имейте в виду, что таким образом экземпляр не будет иметь права на сборщик мусора, пока действует экземпляр делегата. Иногда это является причиной утечек объектов (некоторые люди называют их утечками памяти, несмотря на тот факт, что утечка находится на более высоком уровне и отличается от утечки памяти в стиле C)

1 голос
/ 21 марта 2012

Вы ошибаетесь из-за того, что делегатам необходимо использовать статические методы.

Сигнатура метода (возвращаемый тип и параметры - типы, число и порядок) должна соответствовать делегату, чтобы быть совместимым с ним.

От MSDN - Делегаты (Руководство по программированию в C #) :

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

(выделено мной)


При использовании метода instance как цель делегата, вы должны ссылаться на фактический экземпляр:

public class MyClass
{
    public static void DelegateMethod(string message)
    {
        System.Console.WriteLine(message);
    }
}

var myClass = new MyClass();
Del handler = new Del(myClass.DelegateMethod);
0 голосов
/ 21 марта 2012

Просто предположение здесь. Это метод, который содержит этот код:

Del handler = new Del( DelegateMethod);
handler("Hello World");
Console.Read();

Также статично? В этом случае DelegateMethod также должен быть статическим, поскольку вы не можете ссылаться на нестатический метод из статического.

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