Re: для этого ли нужны делегаты?
От: Sinix  
Дата: 30.04.16 18:10
Оценка: 3 (1)
Здравствуйте, BadCats, Вы писали:

BC>всем привет, только начал изучать делегаты. Имеется вот такой пример:

охх. Проще нормально объяснить, чем объяснить, что с объяснением выше не так.

Делегаты — это способ сделать следующее: взять произвольный кусок кода, упаковать его в объект (экземпляр делегата) и вызвать этот кусок кода в любом месте, куда получится передать ссылку на наш экземпляр делегата.

Опционально делегат может принимать параметры и/или возвращать значение, это описывается при объявлении делегата, но на сам принцип работы это никак не влияет.

собственно пример:

// Описываем и используем экземпляр делегата.
        // 1. Описываем делегат.
        // он будет принимать один строковый параметр, возвращать строку.
        public delegate string SayHelloDelegate(string name);

        // 2. Пишем код, который будет использовать наш делегат
        public static void SayHelloToUsers(SayHelloDelegate sayHelloTo)
        {
            // Вызываем делегат
            string sayHelloMessage = sayHelloTo("John");
            // Выводим результат
            Console.WriteLine(sayHelloMessage);

            string sayHelloMessage2 = sayHelloTo("Mary");
            Console.WriteLine(sayHelloMessage2);
        }

// код ниже может быть расположен в другом классе или в другой сборке.

        // 3. Пишем пару методов, которые создают строку приветствия для пользователя
        private static string SayHello1(string name)
        {
            return "Алоха, " + name + "!";
        }
        private static string SayHello2(string name)
        {
            return "Добро пожаловать, " + name + "!";
        }

        // 4. собираем всю магию вместе.
        public static void Main(string[] args)
        {
            Random rnd = new Random();
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine();
                Console.WriteLine("Попытка #" + i);

                SayHelloDelegate sayHelloDelegate;
                // бросаем монетку
                if (rnd.NextDouble() < 0.5)
                {
                    // выбрали метод 1.
                    sayHelloDelegate = SayHello1;
                }
                else
                {
                    // выбрали метод 2.
                    sayHelloDelegate = SayHello2;
                }

                // передаём наш кусок кода в метод, откуда они будет вызван
                SayHelloToUsers(sayHelloDelegate);
            }

            Console.ReadKey();
        }


BC>Ошибка 1

BC>Для нестатического поля, метода или свойства "Delegates.MyClass.Method(string)" требуется ссылка на объект

В переводе на человеческий это означает следующее: MyClass.Method — это нестатический метод, чтобы его вызвать, надо иметь ссылку на объект типа MyClass().

т.е.
MyClass myClass = new MyClass();
...

myClass.Method("djon");

типа сработает.

Типа — потому что в реальном коде может не быть возможности напрямую передать в код ссылку на объект типа MyClass. Например, если код лежит в сборке, которая про MyClass ничего не знает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.