Should we mark read-only objects if they are fields of the IDisposable class

DESCRIPTION OF THE PROBLEM:

  • I have this class (FooClass) that implements IDisposable, which takes another one-time (OtherDisposableClass) as an argument to its constructor.
  • I create an instance of OtherDisposableClass
  • I create an instance of FooClass and pass it an instance of OtherDisposableClass
  • The OtherDisposableClass instance should not be mutable, so I mark it as read only
  • I cannot get rid of the reference to the OtherDisposableClass instance in my Dispose method

Question

What is the best thing to do here? Should we

  • Do not specify an instance of OtherDisposableClass as readonly, so we can set it to 'Dispose' in the Dispose method
  • Mark OtherDisposableClass as read-only and do not delete the link to it again.
  • Something else

Please clarify your answer. thank you

public class FooClass : IDisposable
{
    private readonly OtherDisposableClass _disposable;
    private readonly string _imageSource;
    private readonly string _action;
    private readonly string _destination;

    private bool _isInitialized;

    public FooClass(OtherDisposableClass disposable)
    {
        _disposable = disposable;
    }
    ~FooClass() 
    {
        // Finalizer calls Dispose(false)
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        // Not possible because _disposable is marked readonly
        _disposable = null;
    }
}
+4
source share
4 answers

What the creature does OtherDisposableClassis to get rid of it ... leave it alone FooClass(you can have it readonlyif you want).

Setting it to null will still have no effect, it will only set the link from FooClass to zero (which will be deleted anyway).

EDIT

, IDisposable - . OtherDisposableClass FooClass, IDisposable OtherDisposableClass.Dispose() FooClass.Dispose().

FooClass OtherFooClass - OtherFooClass FooClass - FooClass GC'd , OtherDisposableClass - GC'd

+4

VB.NET, , IDisposable, , WithEvents, - - null Dispose, , , , , . , .

# WithEvents VB.NET, #, :

// Handle a property Wobbler which identifies an object whose Wibbled event
// I want to handle with my WibbleWobble method.
Woozle _wobble;
Woozle Wobbler {
  get { return _wobbler; }
  set {
    var wasWobbler = _wobbler
    if (wasWobbler == value) return; // Don't unsubcribe and resubscribe same object
    if (wasWobbler != null)
      wasWobbler.Wibbled -= WibbleWobble; // Unsubscribe old event
    if (value != null)
      value.Wibbled += WibbleWobble; // Subscribe new event
    _wobbler = value;
  }
};

(, , ), Wobbler null Dispose, , , .

, , Dispose null, , , , - , Dispose . , null . , , ; "" , , , , , , GC. , , , .

, , , / , _wobbler Interlocked, _wobbler / , Wobbler George - , , ( ). / , Wobbler George , ( ).

0

IDisposable . , .. . , , . .

IDisposable. , . , , . FooClass , . , FooClass.Dispose OtherDisposableClass.Dispose, Dispose ( disposing - true). Dispose, , .

, :

  • .

  • Dispose .

  • Dispose Dispose , ( ).

  • Dispose .

  • IDisposable null Dispose.

  • , - .

  • IDisposable , , Dispose / . .

null:

, . , FooClass OtherDisposableClass, (, throw ObjectDisposedException , Dispose).

OtherDisposableClass null, , . FooClass , , , . , FooClass, OtherDisposableClass GC root, . FooClass OtherDisposableClass, .

0
source

You are correct in setting the member IDisposableto null in Dispose(bool disposing), see: https://msdn.microsoft.com/en-us/library/ms244737.aspx

As you can’t, if the box is checked readonly, I’m afraid to delete readonly.

0
source

All Articles