Почему C # не разрешает модификаторы доступа для деструкторов? - PullRequest
3 голосов
/ 06 марта 2010

Я делал простой класс для небольшого проекта и решил просто добавить деструктор для быстрого имплирования вместо использования IDisposable, и я сталкивался с ошибкой компилятора всякий раз, когда есть деструктор с модификатором доступа.

public class MyClass
{
    public ~MyClass()
    {
        // clean resources
    }
}

Я пробовал публичный, частный, защищенный и внутренний. Работало нормально без модификаторов доступа. Поскольку эта статья показывает , что деструктор по сути является синтетическим сахаром для защищенной функции Finalize, мне кажется странным, что вы не можете использовать хотя бы защищенный деструктор. В статье говорится: «Разрушители не могут быть вызваны. Они вызываются автоматически». Это как это поведение принудительно?

В конечном итоге я просто внедрил IDisposable, но мне любопытно ... Есть ли другая причина, по которой вы не можете поместить модификаторы доступа в деструктор ?

Ответы [ 4 ]

16 голосов
/ 06 марта 2010

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

модификатор доступности изменяет содержимое домена доступности.

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

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

Причина этого в том, что мы хотим предоставить вам принудительный инвариант, чтобы деструктор для конкретного экземпляра запускался ровно один раз в течение времени жизни объекта, в конце указанного срока жизни.(«Воскрешение» мертвых объектов во время финализации вызывает интересные вопросы, которые я расскажу позже.) Запретив доступ к деструктору, мы гарантируем, что пользовательский код никогда не вызовет деструктор на ранней стадии.

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

Вы хотели победить эту функцию безопасности?Зачем?Можете ли вы описать сценарий, в котором важно, чтобы вы могли вызывать деструктор из некоторой области текста программы?

деструктор по сути является синтетическим сахаром для защищенной функции Finalize

Верно.Спецификация отмечает это в разделе 10.13.И обратите внимание, что домен доступности для предположительно защищенного метода "Завершить" также пуст;это не может быть ни переопределено, ни вызвано.

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

14 голосов
/ 06 марта 2010

Модификатор доступа определяет, какая область написанного пользователем кода может вызывать метод.

public означает, что любой пользовательский код может вызывать метод и т. Д. И т. П.

Однако деструкторы не вызываются пользовательским кодом. Деструкторы вызываются автоматически GC. Модификатор доступа ничего не значит для ГХ.

Следовательно, добавление модификатора доступа в метод не имеет смысла. К нему нельзя получить доступ, и этот доступ нельзя изменить.

Вы могли бы также считать доступ к деструктору «сверхприватным», поскольку никто, даже сам объект, не может вызвать деструктор.

5 голосов
/ 06 марта 2010

Это потому, что, как вы указываете, «Разрушители не могут быть вызваны. Они вызываются автоматически».

Бессмысленно иметь модификатор доступа к чему-то, к чему нельзя получить доступ.

0 голосов
/ 06 марта 2010

Вы должны использовать одноразовый узор.

Завершение / удаление шаблона в C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...