Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
nazarmyua
0 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 26
#1

Делегаты, разобрать простой пример

02.04.2015, 18:22. Просмотров 1032. Ответов 5
Метки нет (Все метки)

Добрый день.
Почему выводит на экран только: "2"? Я ожидал увидеть: "12"

C#
1
2
3
4
5
6
7
8
9
10
delegate int MyDel();
 
    static void Main(string[] args)
    {
        MyDel del1 = () => 1;
        MyDel del2 = () => 2;
        MyDel del3 = del1 + del2;
        Console.Write(del3());
        Console.ReadLine();
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2015, 18:22
Ответы с готовыми решениями:

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

Разобрать пример наследования
Вопрос по наследованию: допустип есть базовый класс А; есть производный от...

Перегрузка метода - разобрать пример
Привет всем , увидел такую конструкцию и не совсем понял для чего она. Есть...

Не могу разобрать пример в книге
Доброго времени суток.Начал изучение С# по "Шилдт Г. полное руководство...

Разобрать пример с Array.Sort()
Здравствуйте! не могу понять как так получается что строка sr1.Sort(ref...

5
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
02.04.2015, 18:34 #2
nazarmyua, тут нету операции сложения (ну как пример += не работает), поэтому ваш третиий делегат получает ссылку на второй
0
nazarmyua
0 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 26
02.04.2015, 18:51  [ТС] #3
Я понимаю что делегаты не имеют операции конкатенации, но они могут реализовывать опереции комбинирования и тогда насколько я понимаю будут выполняться все методы или лямбда виражения как в этой программе (выводит на консоль Method1 и Method2):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public delegate void MyDelegate();
 
    class Program
    {
        public static void Method1()
        {
            Console.WriteLine("Method1");
        }
        public static void Method2()
        {
            Console.WriteLine("Method2");
        }
 
        static void Main()
        {
            MyDelegate myDelegate = null;
            MyDelegate myDelegate1 = new MyDelegate(Method1);
            MyDelegate myDelegate2 = new MyDelegate(Method2);           
 
            myDelegate = myDelegate1 + myDelegate2;
            
            myDelegate.Invoke();
            
            Console.ReadKey();
        }
    }
Если не трудно объясните различие между программами
0
insite2012
Модератор
Эксперт .NET
4827 / 3787 / 1089
Регистрация: 12.10.2013
Сообщений: 11,066
Записей в блоге: 2
02.04.2015, 19:05 #4
Цитата Сообщение от nazarmyua Посмотреть сообщение
они могут реализовывать опереции комбинирования
Это не комбинирование. Оператор + для делегатов переопределен, и он служит для сцепления списков вызовов обоих делегатов. Проверьте список вызовов (методом GetInvocationList()) результирующего делегата.
0
_exp10der_
Warrior
490 / 417 / 177
Регистрация: 23.11.2014
Сообщений: 932
02.04.2015, 19:06 #5
https://rsdn.ru/article/dotnet/delegat.xml

Попробуйте прочесть наверняка поможет!
0
insite2012
Модератор
Эксперт .NET
4827 / 3787 / 1089
Регистрация: 12.10.2013
Сообщений: 11,066
Записей в блоге: 2
02.04.2015, 19:08 #6
nazarmyua, вот пример с вашим кодом. В результирующем делегате есть оба.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3 {
    class Program {
        delegate int MyDelegate();
 
        static void Main(string[] args) {
            MyDelegate del1 = () => 1;
            MyDelegate del2 = () => 2;
            MyDelegate del3 = del1 + del2;
 
            int result = del3.GetInvocationList().Sum(d => ((MyDelegate)d).Invoke());
            Console.WriteLine(result);
            Console.ReadLine();
        }
    }
}
0
02.04.2015, 19:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2015, 19:08

Не могу разобрать требование задачи (простой)
Хоть и написал, что "простой", я лишь занимаюсь самостоятельным разбором языка...

Перегрузка методов - разобрать пример кода
Вечер добрый. Есть классы: class Cl1 { public virtual...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru