Нужно ли утилизировать ссылку на собственный метод, и если да, то есть ли рекомендуемые методы для этого? - PullRequest
0 голосов
/ 04 октября 2010

У меня есть класс, который использует метод в user32.dll:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr windowHandlerPtr);

Согласно Effective C #, все классы, использующие неуправляемый код, должны реализовывать как IDisposable, так и финализатор. Не вдаваясь в подробности этого обсуждения, есть ли необходимость избавиться от такого рода объявления внешнего метода? Если так - как будет выглядеть этот метод удаления?

Ответы [ 3 ]

3 голосов
/ 04 октября 2010

Это на самом деле не «ссылка», а декларация. На самом деле он ничего не создает, поэтому не нужно избавляться (на самом деле ничего не нужно распоряжаться).

Использование возвращаемого значения из неуправляемого кода - это то, на что вы должны смотреть - в этом случае это просто бул, о котором вам не нужно беспокоиться. Но в большинстве случаев вы должны просмотреть документацию неуправляемого API, чтобы увидеть, следует ли его выпускать каким-либо образом. Если это так, то оберните это в класс, который вы можете правильно утилизировать. Вот достойная статья о IDisposable

Практическое правило: если он реализует IDisposable, всегда удаляйте его, а если это неуправляемый ресурс , убедитесь, что он правильно освобожден.

1 голос
/ 04 октября 2010

Согласно действующему C #, должны ли все классы, использующие неуправляемый код, реализовывать как IDisposable, так и финализатор.

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

Аргумент, передаваемый в SetForegroundWindow, действительно является одним изэти ресурсы.Это ручка к окну.Но вы не создали это окно самостоятельно, вы пытаетесь установить фокус на какое-то окно, которое уже было создано и управляется другим кодом.Вы должны не распоряжаться объектами, которые вы не создавали.

Примечательно также и то, что рекомендации устарели.Дескрипторы Windows должны быть обернуты одним из производных классов SafeHandle.Они уже предоставляют финализатор, вы не должны реализовывать свой собственный.Просто внедрите Dispose () и вызовите метод SafeHandle.Dispose ().

1 голос
/ 04 октября 2010

В этом случае IntPtr не имеет неуправляемого ресурса, который должен быть утилизирован.Возвращаемое значение равно bool, поэтому так же ничего не делать.Однако может быть важно, как вы овладеете IntPtr, если вы создаете его (например, createDC), вам нужно его освободить (вызывая другой неуправляемый метод), но в этом случае вы просто получаете значение и затем передаете его.

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