.NET'te "yönetilen" ve "yönetilmeyen" kaynaklar ile ne kastedilmektedir?


Yanıtlar:


80

"Yönetilmeyen kaynak" terimi genellikle doğrudan çöp toplayıcının kontrolü altında olmayan bir şeyi açıklamak için kullanılır . Örneğin, bir veritabanı sunucusuna bir bağlantı açarsanız, sağlayıcı tamamen yönetilen kodla yazılmamışsa, bu, sunucudaki kaynakları (bağlantıyı sürdürmek için) ve muhtemelen istemci makinesindeki diğer ağ dışı kaynakları kullanır.

Bu nedenle, veritabanı bağlantısı gibi bir şey için, kodunuzu şu şekilde yazmanız önerilir:

using (var connection = new SqlConnection("connection_string_here"))
{
    // Code to use connection here
}

Bu .Dispose(), bunun bağlantı nesnesinde çağrılmasını sağladığından, yönetilmeyen kaynakların temizlenmesini sağlar.


20
Biraz açıklığa kavuşturabilirim: "yönetilmeyen kaynak", çöp toplayıcının terk edildikten sonra nasıl temizleyeceğini bilemeyeceği bir şeydir. Örneğin, kısa ömürlü bir nesnenin uzun ömürlü bir nesneden bir olaya aboneliği, her iki nesne de çöp toplayıcının kontrolü altında olsa bile yönetilmeyen bir kaynak olacaktır, çünkü GC'nin aboneliğin ne olduğunu bilmesinin bir yolu olmayacaktır. abone terk edilirse ancak yayıncı terk edilmezse hurdaya çıkarılmalıdır. Yayıncının ömrü boyunca sınırsız sayıda abone oluşturulabilir ve terk edilebilirse, bu bir bellek sızıntısına neden olur.
supercat

12
Biraz daha açıklama eklemek: SqlConnection (veya FileStream, vb.), GC'nin farkında olmadığı yönetilmeyen kaynakları dahili olarak kullanan yönetilen kaynaklardır.
jimvfr

2
jimvfr haklı, SqlConnection yönetilen kaynaklara bir örnek. Yönetilmeyen kaynaklara bir örnek, Marshal.AllocHGlobal () yöntemini kullanarak yönetilmeyen bellekten bellek ayırmamız gerektiğinde verilebilir, bu durumda yönetilmeyen bir kaynaktır, bu durumda en iyi uygulama bir yıkıcı (~ ctor) kullanır ve Marshal.FreeHGlobal () 'ı çağırır. bu hafızayı serbest bırakmak için.
Ygor Thomaz

hem yönetilen hem de yönetilmeyen kaynaklar için bir örnek verebilir misiniz?
Radha Manohar

32

Yönetilen kaynaklar, saf .NET kodu olan ve çalışma zamanı tarafından yönetilen ve doğrudan denetimi altında olan kaynaklardır.

Yönetilmeyen kaynaklar, yönetilmeyen kaynaklardır. Dosya tanıtıcıları, sabitlenmiş bellek, COM nesneleri, veritabanı bağlantıları vb.


13

Soru-Cevap bölümünde Yönetilmeyen kaynaklar nelerdir? 1 , Bruce Wood şunları yayınladı:

"Yönetilen" ve "yönetilmeyen" terimlerini şu şekilde düşünüyorum:

"Yönetilen" , .NET korumalı alanındaki herhangi bir şeyi ifade eder. Bu, tüm .NET Framework sınıflarını içerir.

"Yönetilmeyen" , .NET korumalı alanı dışındaki vahşi doğayı ifade eder. Bu, Win32 API işlevlerine yapılan çağrılarla size döndürülen her şeyi içerir.

Hiçbir zaman bir Win32 API işlevini çağırmazsanız ve hiçbir Win32 "tutamaç" nesnesini geri alamazsanız, yönetilmeyen kaynakları tutmuyorsunuz demektir. .NET Framework sınıf yöntemleri aracılığıyla açtığınız dosyalar ve akışların tümü yönetilen sarmalayıcılardır.

Yorum: Yönetilmeyen bir kaynağı doğrudan tutuyor olabilirsiniz . Ancak, System.IO.FileStream gibi yönetilen bir "sarmalayıcı sınıf" aracılığıyla dolaylı olarak yönetilmeyen bir kaynağı tutuyor olabilirsiniz . Böyle bir sarmalayıcı sınıfı genellikle IDisposable'ı (doğrudan veya kalıtım yoluyla) uygular .

... birçok yönetilen (.NET Framework) nesnesi, yönetilmeyen kaynakları içlerinde tutmaktadır ve muhtemelen bunları olabildiğince çabuk Dispose () yapmak veya en azından arayanlarınıza bunu yapma fırsatı sunmak istersiniz. İşte burada kendi Dispose () yönteminizi yazmak devreye girer. Esasen, IDisposable () uygulamak sizin için iki şey yapar:

  1. Doğrudan .NET'in arkasındaki işletim sisteminden (yönetilmeyen kaynaklar) yakaladığınız tüm kaynaklardan kurtulmanızı sağlar.

  2. Size ve arayanlarınıza, değerli kaynakları sizin / arayanların şimdi serbest bırakmak istediğiniz kirli küçük ellerinde tutan ağır .NET nesnelerini / .NET nesnelerini serbest bırakmanızı sağlar .

Yorum:IDisposable Bir Dispose()yöntemi uygulayarak ve böylece sağlayarak , sınıfınızdaki bir kullanıcının, sınıfınızın bir örnek tarafından tutulan yönetilmeyen kaynakları belirleyici bir şekilde serbest bırakmasını sağlarsınız.


1 Bağlantı ilk olarak Sachin Shanbhag'ın cevabında paylaşıldı . 2005-11-17 tarihli alıntılanan materyal. Alıntılanan içeriği hafifçe kopyaladığımı unutmayın.


5

Yönetilen ve yönetilmeyen kaynak arasındaki temel fark, çöp toplayıcının tüm yönetilen kaynakları bilmesi, zamanın bir noktasında GC'nin gelip yönetilen bir nesneyle ilişkili tüm bellek ve kaynakları temizlemesidir. GC dosyalar, akışlar ve tanıtıcılar gibi yönetilmeyen kaynaklar hakkında bilgi sahibi değildir, bu nedenle bunları kodunuzda açıkça temizlemezseniz bellek sızıntıları ve kilitli kaynaklarla sonuçlanırsınız.

Daha fazla ayrıntı için - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources


1
"IDisposable arayüzün arkasındaki fikir, kaynakları belirleyici bir şekilde temizlemenize ve yönetilmeyen kaynakları temizlemenize izin vermektir." Harika!
zionpi

0

Yönetilen kaynaklar, çöp toplayıcı tarafından serbest bırakılabilen kaynaklardır ve yönetilmeyen kaynaklar çöp toplayıcı tarafından serbest bırakılamaz, bu amaçla yıkıcı gereklidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.