Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C# -- помогите разобрать код / 11 сообщений из 11, страница 1 из 1
13.07.2011, 15:34
    #37350015
Жентос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
static void Main()
   {
       // Construct a ConcurrentDictionary
       ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>();

       // Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
       Parallel.For(0, 10000, i =>
       {
           // Initial call will set cd[1] = 1.  
           // Ensuing calls will set cd[1] = cd[1] + 1
           cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
       });
   }

Объясните, пожалуйста, что обозначает фрагмент "(key, oldValue) => oldValue + 1"
...
Рейтинг: 0 / 0
13.07.2011, 15:46
    #37350051
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
ЖентосОбъясните, пожалуйста, что обозначает фрагмент "(key, oldValue) => oldValue + 1" это лямбда-выражение (объект-функция, созданный прямо в коде, "на лету").
тоже самое что "анонимный метод"
...
Рейтинг: 0 / 0
13.07.2011, 17:04
    #37350276
Жентос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
Спасибо, прочитал про анонимные методы и лямда-выражения.

Осталось непонятно, откуда параметры "key, oldValue" взялись? Явно они не описаны, делегата в примере тоже нет (пример я из MSDN скопировал)
...
Рейтинг: 0 / 0
13.07.2011, 17:17
    #37350300
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
ЖентосСпасибо, прочитал про анонимные методы и лямда-выражения.

Осталось непонятно, откуда параметры "key, oldValue" взялись? Явно они не описаны, делегата в примере тоже нет (пример я из MSDN скопировал) имена аргументов анонимной функции
...
Рейтинг: 0 / 0
13.07.2011, 17:51
    #37350381
Жентос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
Nafимена аргументов анонимной функции
Это я понял. Я не понимаю, как компилятор понимает, что key и oldValue равны 1 изначально.

Получается, что компилятор видит структуру KeyValuePair<TKey, TValue> -- элемент коллекции ConcurrentDictionary изнутри, но у этой структуры нет поля oldValue... Мне понятно, что лямбда-функция постоянно увеличивает из двух переданных параметров второй на единицу, мне непонятно: откуда лямбда-функция знает, что "точкой отсчета" является (1, 1), и как сохраняется промежуточное значение

P.S. Я очень слабо знаю С#, и потому спрашиваю
...
Рейтинг: 0 / 0
13.07.2011, 18:04
    #37350399
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
ЖентосЭто я понял. Я не понимаю, как компилятор понимает, что key и oldValue равны 1 изначально.cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
AddOrUpdate третьим параметром принимает ссылку на метод. И внутри себя вызывает этот метод, передавая ему параметры 1 и 1. Так key, oldValue внутри метода становятся единицами.
...
Рейтинг: 0 / 0
13.07.2011, 18:16
    #37350418
Жентос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
Яростный Мечcd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
AddOrUpdate третьим параметром принимает ссылку на метод. И внутри себя вызывает этот метод, передавая ему параметры 1 и 1. Так key, oldValue внутри метода становятся единицами.
Я понимаю, что третий параметр -- делегат Func<T1, T2, TResult>

public delegate TResult Func<in T1, in T2, out TResult>(
T1 arg1,
T2 arg2
)

Мне не понятно, откуда в T1 и T2 единицы -- они же не объявлены явно. Именно момент передачи параметров не понятен
...
Рейтинг: 0 / 0
13.07.2011, 18:20
    #37350426
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
ЖентосИменно момент передачи параметров не понятен вызов делегата и передача параметров происходят внутри AddOrUpdate, как уже говорилось.
...
Рейтинг: 0 / 0
13.07.2011, 18:39
    #37350458
Жентос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
10969507 Вот, если бы этот момент Вы разжевали, я был бы очень благодарен
...
Рейтинг: 0 / 0
14.07.2011, 15:42
    #37351937
авторh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
Жентос 10969507 Вот, если бы этот момент Вы разжевали, я был бы очень благодарен

что не понятно? там внутри примерно такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void Dictinoary.AddOrUpdate(T key, T initialValue, lambda(T key, T oldValue) updateFn)
{
    if this.exist(key){ 
          this[key] = updateFn(key, this[key]);
    } else {
          this[key] = initialValue;
    }    
}
за исключением МНОГОПОТОЧНОСТИ и ПАРАЛЕЛЛЬНОСТИ и C#-ого синтаксиса.
...
Рейтинг: 0 / 0
14.07.2011, 17:08
    #37352214
Жентос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# -- помогите разобрать код
Спасибо, теперь все понятно
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C# -- помогите разобрать код / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]