Sınıfım, Interop'tan bir nesne içeriyor ve üzerine bir şeylerin atanmasına neden olan bir yöntem çağırıyor. Aynı zamanda bu maddeleri boşaltmak için bir yöntem sunar, bu yüzden ben Dispose() bu çağırmalıdır bekliyoruz:Bir Interop COM Nesnesi sarılırken atma desenini C# olarak nasıl uygularım?
class MyClass : IDisposable
{
private DllName.ComClassName comInstance;
void SomeMethod()
{
comInstance = new DllName.ComClassName();
comInstance.AllocStuff();
}
public void Dispose()
{
comInstance.FreeThatStuff();
}
}
Şimdi, imha deseni takip etmek bütün bu genişletmek gerekir. Ben (Interop'un ne değildir içine yönetilen yönetilmeyen sarar?) Öylesine comInstance yönetilmektedir varsayarak, serbest bırakmak için başka tek kullanımlık ya da yönetilmeyen kaynaklara sahip, ben desen çözer düşünüyorum: I sürece sızdırıyor
public void Dispose()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
Dispose desenini kusurlu yapacak olan MyClass örneklerinde Dispose() öğesini açıkça arayın. Böylece comInstance yönetilmeyen olmalıdır demek ve desen için çözer kapsamaz:
public void Dispose()
{
DisposeComInstance();
GC.SuppressFinalize(this);
}
~MyClass()
{
DisposeComInstance();
}
private void DisposeComInstance()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
EDIT:
- Sadece benim sınıf mühür olabilir, tam desenli benim sınıf yığılan önlemek için?
- ComClassName (ve genel olarak herhangi bir sınıfta) yönetilmediğini nasıl anlarım?
Meta-comment: Dispose (bool) öğesinin defalarca defalarca çağrılmaya tahammül edebileceğinden emin olun. Ayrıca, bir istisna olasılığını en aza indirmeye çalışın (her zaman mümkün değil). – user7116
Meta-meta yorumu - bunun yanı sıra, yönetilmeyen temizlemeniz sırasında kilitleri veya kilitleri kullanmamanız önemlidir. – womp