Информация об изменениях

Сообщение Re[4]: Жизнь после Dispose (.net) от 08.07.2015 8:00

Изменено 08.07.2015 8:01 Sinix

Здравствуйте, ylem, Вы писали:

А, да на вопрос забыл ответить


В общем есть (условно) три сценария для Dispose()Ж

1. Scope. Всякие транзакции, потоки, unmanaged-ресурсы. В общем, любой объект, чей нормальный жизненный цикл завершается вызовом Dispose. Вот тут ObjectDisposedException в самый раз.

2. Reusable objects. Встречается гораздо реже, но всё-таки встречается. Dispose() эквивалентен вызову Close(), последующий Open() переводит объект в рабочее состояние.

3. LSD. Реализации, которые не следуют гадлайнам. Например, в Task.cs:
                if ((Options & (TaskCreationOptions)InternalTaskOptions.DoNotDispose) != 0)
                {
                    return;
                }
 
                if (!IsCompleted)
                {
                    throw new InvalidOperationException(Environment.GetResourceString("Task_Dispose_NotCompleted"));
                }

                // ...
Но лучший сборник примеров — это безусловно Rx. Там есть всё.


Ещё есть четвёртый вариант — т.н. toggle disposables. Это простые disposable взамен пары методов BeginSmth()/EndSmth(), т.е.
grid.BeginInit();
// ...
grid.EndInit();

// vs
using (grid.InitScope()) // NB: no var used
{
  // ...
}
По сути, это те же disposable из п.1, только у них нет никаких публичных мемберов и ObjectDisposedException кидать нечем. Нет ручек — нет конфетки


Выбирайте, что вам больше подходит, используйте на здоровье.
Здравствуйте, ylem, Вы писали:

А, да на вопрос забыл ответить


В общем есть (условно) три сценария для Dispose()Ж

1. Scope. Всякие транзакции, потоки, unmanaged-ресурсы. В общем, любой объект, чей нормальный жизненный цикл завершается вызовом Dispose. Вот тут ObjectDisposedException в самый раз.
UPD. Как правило, исключение кидают только методы, содержащие поведение. Всякие геттеры/получение результата etc работают нормально.

2. Reusable objects. Встречается гораздо реже, но всё-таки встречается. Dispose() эквивалентен вызову Close(), последующий Open() переводит объект в рабочее состояние.

3. LSD. Реализации, которые не следуют гадлайнам. Например, в Task.cs:
                if ((Options & (TaskCreationOptions)InternalTaskOptions.DoNotDispose) != 0)
                {
                    return;
                }
 
                if (!IsCompleted)
                {
                    throw new InvalidOperationException(Environment.GetResourceString("Task_Dispose_NotCompleted"));
                }

                // ...
Но лучший сборник примеров — это безусловно Rx. Там есть всё.


Ещё есть четвёртый вариант — т.н. toggle disposables. Это простые disposable взамен пары методов BeginSmth()/EndSmth(), т.е.
grid.BeginInit();
// ...
grid.EndInit();

// vs
using (grid.InitScope()) // NB: no var used
{
  // ...
}
По сути, это те же disposable из п.1, только у них нет никаких публичных мемберов и ObjectDisposedException кидать нечем. Нет ручек — нет конфетки


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