Ich versuche, ein allgemeines Verfahren zum Anordnen eines Objekts zu erstellen, die IDisposable implementiert, genannt DisposeObject()
Ein IDisposable-Objekt als Referenz übergeben verursacht einen Fehler?
sicherzustellen, dass ich ein Objekt bin Entsorgung von ursprünglichen Referenz darauf, ich versuche, ein Objekt als Verweis zu übergeben.
Aber ich bin immer einen Übersetzungsfehler, die
Der 'ref' Argument Typ Parametertyp stimmt nicht überein
sagt
Im unten (vereinfacht) Code, beide _Baz
und _Bar
implementieren IDisposable.
So sind die Fragen,
- Warum bin ich diesen Fehler?
- Gibt es einen Weg, um es zu umgehen?
[UPDATE] Von gibt Antworten so weit, solange ich null kein IDisposable Argument auf, ich kann einfach ein Objekt nach Wert übergeben, ohne ref
zu verwenden. Ich habe jetzt ein weiteres Problem, ob Einwegobjekte zu null
oder nicht innerhalb DisposeObject
Methode festgelegt werden. Hier
ist die vollständige Quelle der Vollständigkeit halber:
public class Foo : IDisposable
{
private Bar _Bar;
private Baz _Baz;
private bool _IsDisposed;
~Foo() { Dispose(false); }
public void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
DisposeObject(ref _Baz);
DisposeObject(ref _Bar);
}
}
_IsDisposed = true;
}
private void DisposeObject(ref IDisposable obj)
{
try
{
if (obj == null)
return;
obj.Dispose();
obj = null;
} catch (ObjectDisposedException) { /* Already Disposed... */ }
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
public class Bar : IDisposable
{
public void Dispose() {}
}
public class Baz : IDisposable
{
public void Dispose() {}
}
[RESULT]
ich den Code entfernt, das Argument setzt auf null (obj = null;
) innerhalb DisposeObject
So ist der endgültige Code wurde.
public void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
DisposeObject(_Baz);
DisposeObject(_Bar);
}
}
_IsDisposed = true;
}
private void DisposeObject(IDisposable obj)
{
try
{
if (obj == null)
return;
obj.Dispose();
} catch (ObjectDisposedException) { /* Already Disposed... */ }
}
Ich sehe keinen besonderen Grund für hier Referenzparameter. Könnten Sie vielleicht näher ausführen? – Noldorin
@Noldorin: Meine ursprüngliche Implementierung bestand darin, ein Argument zu disponieren und auf null zu setzen. "obj == null;" Das war der Grund für "Ref". – Sung
obj == null ist ein Vergleich, keine Zuordnung. obj = null ist eine Zuweisung. –