[c#] Замыкания
От: Sinix  
Дата: 02.03.15 14:46
Оценка: 152 (6)
Простенький пример от Ayende Rahien
var stats = new PerformatStats
{
    Size = largeData.Length
};
stats.OnCompletion += () => this.RecordCompletion(stats);

Write(stats, o =>
{
    var sp = new Stopwatch();
    foreach (var item in largeData)
    {
        sp.Restart();
        // do something with this
        stats.RecordOperationDuration(sp);
    }
});


`stats` — долгоживущий объект, largeData — короткоживущий, зато большой, Write() отрабатывает быстро (в сравнении с временем жизни stats). Казалось бы, что тут может пойти не так?(c) Подробности — по ссылке выше.


И для любителей детективов на вечер: code review одного мааленького исправления в roslyn (часть комментариев скрыта под "Show outdated diff", Github всё-таки фигово приспособлен для длинных обсуждений).
Тот же самый "что тут может пойти не так?", только гораздо круче


UPD Чтобы не плодить посты: ещё один wtf moment, на этот раз от Ben Watson.
class App
{
    public bool IsRunning {get; set;}
    private Thread houseKeepingThread;
    
    public void Start()
    {
        this.IsRunning = true;
        this.houseKeepingThread = new Thread(ThreadFunc);
        this.houseKeepingThread.Start();
    }
    
    private void ThreadFunc()
    {
        while (this.IsRunning)
        {
            DoWork();
            // wait for 30 seconds
        }
    }
};

Снова "что тут может пойти не так?", только теперь
  подсказка
банановый с volatile
Отредактировано 03.03.2015 6:53 Sinix . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.