Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2016, 19:28   #1
BadCats
Пользователь
 
Аватар для BadCats
 
Регистрация: 31.01.2016
Сообщений: 67
Лампочка для этого ли нужны делегаты?

всем привет, только начал изучать делегаты. Имеется вот такой пример:
Код:
// Класс, метод которого будет сообщен с делегатом.
    class MyClass
    {
        // Создаем метод, который планируем сообщить с делегатом.
        public string Method(string name)
        {
            return "Hello " + name;
        }
    }

    // На 21-й строке создаем класс-делегата с именем MyDelegate,
    // метод, который будет сообщен с экземпляром данного класса-делегата, 
    // будет принимать один строковой аргумент и возвращать строковое значение.

    public delegate string MyDelegate(string name);  // Создаем класс делегата. (1) 

    class Program
    {
        static void Main()
        {
            MyClass instance = new MyClass();

            MyDelegate myDelegate = new MyDelegate(instance.Method); // Создаем экземпляр делегата и сообщаем с ним метод. (2)
            

           string greeting = myDelegate.Invoke("djon"); // Вызываем метод сообщенный с делегатом. (3)
           

            Console.WriteLine(greeting);

            greeting = myDelegate("Grady Booch"); // Другой способ вызова метода сообщенного с делегатом. (3')

            Console.WriteLine(greeting);

            // Delay.
            Console.ReadKey();
        }
    }
ради интереса заменил строку:
Код:
string greeting = myDelegate("djon"); // Вызываем метод сообщенный с делегатом. (3)
на
Код:
string greetingg = MyClass.Method("djon");
и получил следующую ошибку от Visual Studio 2012 :
Ошибка 1
Для нестатического поля, метода или свойства "Delegates.MyClass.Method(strin g)" требуется ссылка на объект


делегат это и есть объект, содержащий в себе указатели на методы.

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

Если так, то хорошо, если нет то приведите свои жизненные примеры использования делегатов.
BadCats вне форума Ответить с цитированием
Старый 30.04.2016, 19:41   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык Method не static, для его вызова нужен экземпляр класса.
Вы ж instance создавали выше.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.05.2016, 10:02   #3
BadCats
Пользователь
 
Аватар для BadCats
 
Регистрация: 31.01.2016
Сообщений: 67
По умолчанию

Здравствуйте, спасибо за ответ. Я так понял, вы имеете ввиду, что экземпляры делегатов принимают в качестве параметра метод вызванный не только на классе-объекте:
Код:
MyClass.Method(); (1)
, но и метод можно вызвать и на экземпляре класса в котором этот содержится:
Код:
MyClass instance = new MyClass  (2)
Instance.Method();
Обозначим эти два способа передачи метода в параметры делегата цифрами (1) и (2)
Первый способ, где в конструкторе делегата мы передаем метод – вызывая его на классе-объекте того класса, где этот метод содержится, Но первый способ работает только если метод static.

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

Просто если разница между классами и структурами для меня стала очевидной – классы хранятся на куче, структуры в стеке, то для чего на реальной практике они используются я понять не могу (и да, я некоем образом напрямую не сравниваю делегаты, и экземпляры -как абстракцию )
BadCats вне форума Ответить с цитированием
Старый 02.05.2016, 10:29   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

А в делегат что передадите, то и вызовется.
Можно и вообще лямбду или анонимный метод использовать например
Код:
MyDelegate myDelegate = new MyDelegate(name => name.ToUpper());
new MyDelegate кстати можно не писать
Код:
MyDelegate myDelegate = inst.Method;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 02.05.2016 в 10:50.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как написать формулу для этого? 777pro777 Microsoft Office Excel 1 14.02.2012 08:11
После сохранения в файл *.xls при открытии этого файла выдается предупреждение. Как от этого избавиться? A-IX-2 Общие вопросы Delphi 1 13.11.2011 20:33
Парни староват я для этого!! Иост Помощь студентам 0 31.05.2011 22:05
Хочу сделать форму для ввода паролей! Для этого текст должен быть зашифрован в (*****) ! Как сделать vitaaly Visual C++ 2 12.02.2011 12:29
нарисуйте алгоритм для этого кода! Falkone Общие вопросы Delphi 0 16.05.2010 16:17