Используя IDisposable для отмены подписки событий

Используя эту функцию PHP mysql_escape_string(), вы можете быстро получить хорошую профилактику.

Например:

SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."'

mysql_escape_string - Сбрасывает строку для использования в mysql_query

Для большей профилактики вы можете добавить в конце ...

wHERE 1=1   or  LIMIT 1

Наконец вы получаете:

SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."' LIMIT 1
49
задан Community 23 May 2017 в 02:17
поделиться

6 ответов

Да, пойдите для него. Хотя некоторые люди думают, что IDisposable реализован только для неуправляемых ресурсов, дело обстоит не так - неуправляемые ресурсы просто, оказывается, самая большая победа и самая очевидная причина реализовать его. Я думаю ее полученный эта идея, потому что люди не могли думать ни о какой другой причине использовать ее. Не как финализатор, который является проблемой производительности и не легкий для GC обработать хорошо.

Вставленный в любой опрятный код Ваш располагать метод. Это будет более ясным, более чистым и значительно более вероятным предотвратить утечки памяти и проклятый вид, легче использовать правильно, чем попытка не забыть отменять Ваши ссылки.

намерение IDisposable состоит в том, чтобы заставить Ваш код работать лучше без Вас имеющий необходимость сделать большой физический труд. Используйте его питание в Вашу пользу и преобладайте над некоторой искусственной "ерундой" намерения дизайна.

я помню, что было достаточно трудно убедить Microsoft полноценности детерминированного завершения назад, когда.NET сначала вышла - мы выиграли сражение и убедили их добавить его (даже если это был только шаблон разработки в то время), используйте его!

39
ответ дан gbjbaanb 7 November 2019 в 11:47
поделиться

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

IDisposable может использоваться для управления подписками события, но вероятно не был должен. Для примера я указываю на Вас на WPF. Это - библиотека, изобилующая событиями и обработчиками событий. Все же фактически никакой класс в WPF не реализует IDisposable. Я взял бы это в качестве признака, что событиями нужно управлять иначе.

13
ответ дан JaredPar 7 November 2019 в 11:47
поделиться

IDisposable твердо о ресурсах и источнике достаточных проблем не пачкать воды далее, я думаю.

я голосую за Отказываться от подписки метод в Вашем собственном Интерфейсе также.

3
ответ дан annakata 7 November 2019 в 11:47
поделиться

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

, Который может или не может быть хорошей идеей в Вашем особом случае - я не думаю, что мы действительно получили достаточно информации - но это достойно рассмотрения.

3
ответ дан Jon Skeet 7 November 2019 в 11:47
поделиться

Другая опция состояла бы в том, чтобы использовать слабые делегаты или что-то как слабые события WPFs , вместо того, чтобы иметь необходимость отказаться от подписки явно.

P.S. [OT] я рассматриваю решение только предоставить сильным делегатам единственную самую дорогую ошибку дизайна платформы.NET.

3
ответ дан 7 November 2019 в 11:47
поделиться

Я думаю, что одноразовые - это все, что может GC Я не забочусь об этом автоматически, и ссылки на события учитываются в моей книге. Вот вспомогательный класс, который я придумал.

public class DisposableEvent<T> : IDisposable
    {

        EventHandler<EventArgs<T>> Target { get; set; }
        public T Args { get; set; }
        bool fired = false;

        public DisposableEvent(EventHandler<EventArgs<T>> target)
        {
            Target = target;
            Target += new EventHandler<EventArgs<T>>(subscriber);
        }

        public bool Wait(int howLongSeconds)
        {
            DateTime start = DateTime.Now;
            while (!fired && (DateTime.Now - start).TotalSeconds < howLongSeconds)
            {
                Thread.Sleep(100);
            }
            return fired;
        }

        void subscriber(object sender, EventArgs<T> e)
        {
            Args = e.Value;
            fired = true;
        }

        public void Dispose()
        {
            Target -= subscriber;
            Target = null;
        }

    }

, который позволяет вам написать этот код:

Class1 class1 = new Class1();
            using (var x = new DisposableEvent<object>(class1.Test))
            {
                if (x.Wait(30))
                {
                    var result = x.Args;
                }
            }

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

4
ответ дан 7 November 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: