Почему Finalize должен быть защищен? - PullRequest
2 голосов
/ 05 мая 2011

Чтение этой статьи MSDN , я наткнулся на этот простой пример, который мне действительно подходит, так как я делал несколько RAII классов для некоторых нативных интерфейсов c ++, выполняя всю работу :( и я делаю это впервые)

ref class Wrapper {
    Native *pn;
public:
    // resource acquisition is initialization
    Wrapper( int val ) { pn = new Native( val ); } 

    // this will do our disposition of the native memory
    ~Wrapper(){ delete pn; }

    void mfunc();
protected:

    // an explicit Finalize() method—as a failsafe
    !Wrapper() { delete pn; }
};

Этот класс в точности соответствует тому, что я написал до сих пор. За исключением того, что я не реализовал метод Finalize. Но, задаваясь вопросом о его особенностях и использовании, и прежде чем я смог понять его гораздо глубже ... Мне было интересно, если это общее использование и хорошая привычка, чтобы поместить метод Finalizer в защищенную область.

1 Ответ

5 голосов
/ 05 мая 2011

Модификатор доступа для финализатора по существу игнорируется, поскольку существуют специальные правила для финализаторов:

  1. Они не могут быть вызваны напрямую (даже из самого класса).
  2. При вызове системой они автоматически вызывают финализаторы базового класса.

Официально финализатор - это защищенный виртуальный метод, объявленный в Object: http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx. В C # вы не можете разместить модификатор accesibilty в финализаторе.

В C ++ / cli вы можете указать любой модификатор доступа, но он по существу игнорируется. То есть, сделав его публичным или частным, ничего не изменится: специальные правила все еще применяются.

Так что, я бы сказал, просто продолжайте делать его защищенным только на основе соглашения.

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