.NET'te yönetilen kaynak ve yönetilmeyen kaynak terimleriyle ne kastedilmektedir? Resme nasıl giriyorlar?
.NET'te yönetilen kaynak ve yönetilmeyen kaynak terimleriyle ne kastedilmektedir? Resme nasıl giriyorlar?
Yanıtlar:
"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.
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:
Doğrudan .NET'in arkasındaki işletim sisteminden (yönetilmeyen kaynaklar) yakaladığınız tüm kaynaklardan kurtulmanızı sağlar.
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.
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