C# и глюки с замыканиями
Aug. 14th, 2010 06:02 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я где-то сошел с ума, но с ходу не соображу где.
Есть такой код с замыканиями:
Т.е. я пытаюсь сделать следующее: создать список функций без параметров, которые при вызове будут выдавать результаты от a до f. Это вообще имитация другого, рабочего кода, но суть та же самая.
А теперь внимание, ШИЗА: этот код выдает "f f f f f f", а не то, что я от него хочу ("a b c d e f"). Т.е. делегаты в списке каким-то чудесным образом начинают ссылаться не 6 разных экземпляров замыканий, а на один.
Что-то мне это начинает необъяснимо напоминать недавний пост
alexclear про JavaScript, я сейчас для смеха попробую тамошний workaround.
PS: Жопа, workaround оттуда сработал. В кошмарном сне бы такое не привиделось, что непонятный пост про совершенно неизвестный мне язык через неделю окажется пригодным в работе.
PPS: Оказывается, известная шиза - переменная цикла s объявлена один раз и до цикла, и замыкается оно на нее.
Есть такой код с замыканиями:
class Program { delegate void ZeroArityFunc(); static string[] testData=new string[] { "a", "b", "c", "d", "e", "f" }; static void Main(string[] args) { Listlist = new List (); foreach(string s in testData) { ZeroArityFunc f = () => Console.Write(s); //создаем лямбду и присваиваем ее f list.Add(f); } foreach(ZeroArityFunc a in list) { a(); } } }
Т.е. я пытаюсь сделать следующее: создать список функций без параметров, которые при вызове будут выдавать результаты от a до f. Это вообще имитация другого, рабочего кода, но суть та же самая.
А теперь внимание, ШИЗА: этот код выдает "f f f f f f", а не то, что я от него хочу ("a b c d e f"). Т.е. делегаты в списке каким-то чудесным образом начинают ссылаться не 6 разных экземпляров замыканий, а на один.
Что-то мне это начинает необъяснимо напоминать недавний пост
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
PS: Жопа, workaround оттуда сработал. В кошмарном сне бы такое не привиделось, что непонятный пост про совершенно неизвестный мне язык через неделю окажется пригодным в работе.
PPS: Оказывается, известная шиза - переменная цикла s объявлена один раз и до цикла, и замыкается оно на нее.
no subject
Date: 2010-08-14 06:15 pm (UTC)http://habrahabr.ru/blogs/net/36601/
no subject
Date: 2010-08-14 06:16 pm (UTC)Ну слава богу, я псих, а не дотнет.
no subject
Date: 2010-08-14 07:10 pm (UTC)no subject
Date: 2010-08-14 06:17 pm (UTC)no subject
Date: 2010-08-14 06:19 pm (UTC)Этот случай даже был описан в Этюдах на C# от Эрика Липперта:
http://habrahabr.ru/blogs/net/98779/
no subject
Date: 2010-08-14 06:41 pm (UTC)no subject
Date: 2010-08-14 06:41 pm (UTC)no subject
Date: 2010-08-14 07:07 pm (UTC)no subject
Date: 2010-08-14 07:12 pm (UTC)no subject
Date: 2010-08-14 07:17 pm (UTC)string workaround = s;
и замкнуться на workaround - все работает. При том, что это все равно копирование ссылки, но семантика замыкания меняется.
no subject
Date: 2010-08-14 07:18 pm (UTC)no subject
Date: 2010-08-14 07:14 pm (UTC)Магия и вуду похлеще
no subject
Date: 2010-08-14 07:20 pm (UTC)Потому что альтернативы в виде "позвать ребе
no subject
Date: 2010-08-14 07:21 pm (UTC)В скрипты это никуда не попадёт, просто разовая работа :)
no subject
Date: 2010-08-14 06:45 pm (UTC)no subject
Date: 2010-08-14 10:39 pm (UTC)no subject
Date: 2010-08-14 07:34 pm (UTC)no subject
Date: 2010-08-14 07:36 pm (UTC)no subject
Date: 2010-08-14 07:38 pm (UTC)Замыкается переменная, а не значение. А потом она используется, одна и та же на все замыкания. Замыканий-то много, а переменная в них одна.
no subject
Date: 2010-08-14 07:44 pm (UTC)no subject
Date: 2010-08-14 07:48 pm (UTC)А это все счастье только в 3.5 появилось. К тому времени я уже половину всех этих типов сам написал :)
no subject
Date: 2010-08-14 08:10 pm (UTC)no subject
Date: 2010-08-14 08:18 pm (UTC)Про System.Action я вообще не знал, а var использую только когда типы слишком заебенные чтобы их руками писать, или когда у них вообще тип автоматический.
no subject
Date: 2010-08-14 08:47 pm (UTC)no subject
Date: 2010-08-14 08:57 pm (UTC)Вот чего я не знаю так это как синоним типа в C# написать и меня это бесит :)
no subject
Date: 2010-08-14 10:57 pm (UTC)no subject
Date: 2010-08-14 11:26 pm (UTC)using int = System.Int32;
не?
no subject
Date: 2010-08-14 07:47 pm (UTC)no subject
Date: 2010-08-14 09:44 pm (UTC)компьютер у меня дикое говно, тормозит безбожно, но тем не менее суть игры понятна: UT прекрасный заменитель контре, но вот warsow прекрасный заменитель кваке, подинамичнее так. обе хорошие.
no subject
Date: 2010-08-15 12:58 pm (UTC)