Теоретически, если вы правильно определили компоненты, никогда не нужно требовать вызова Dispose () для ваших объектов, так как финализатор должен в конечном итоге позаботиться об этом.
При этом, всякий раз, когда вы используете объект, который реализует IDisposable, хорошей практикой является вызов Dispose () для объекта, как только вы закончите с ним работать.
Для некоторых ваших конкретных очков:
1) Если вы знаете, что «сделали» с формой, вы можете вызвать Dispose () для нее. Это приведет к очистке в этот момент времени неуправляемых ресурсов , связанных с формой *1011*.
2) В этом случае: если ваш объект просто используется в этом методе, используйте вместо него «using»:
using (MyObject myObject = new MyObject())
{
// use your object
} // It'll be disposed of here for you
3) Есть редкие причины сделать это, но в целом нет.
4) События - это делегаты - память, связанная с делегатом, будет собрана после того, как сам делегат станет рутированным, что обычно происходит, когда рассматриваемые объекты не рутированы.