के माइक्रोसॉफ्ट के कार्यान्वयन को समझने के लिए एक अनुभवी सी ++ प्रोग्रामर नेट के आदी प्राप्त करने की कोशिश के रूप में की कोशिश कर रहा है, वहाँ संपत्ति माइक्रोसॉफ्ट के WeakReference "लक्ष्य" में एक कार्यान्वयन विस्तार है कि मुझे गुस्सा दिलाना है ...WeakReference
public class WeakReference : ISerializable
{
internal IntPtr m_handle;
internal bool m_IsLongReference;
...
public virtual object Target
{
[SecuritySafeCritical]
get
{
IntPtr handle = this.m_handle;
if (IntPtr.Zero == handle)
{
return null;
}
object result = GCHandle.InternalGet(handle);
if (!(this.m_handle == IntPtr.Zero))
{
return result;
}
return null;
}
[SecuritySafeCritical]
set
{
IntPtr handle = this.m_handle;
if (handle == IntPtr.Zero)
{
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_HandleIsNotInitialized"));
}
object oldValue = GCHandle.InternalGet(handle);
handle = this.m_handle;
if (handle == IntPtr.Zero)
{
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_HandleIsNotInitialized"));
}
GCHandle.InternalCompareExchange(handle, value, oldValue, false);
GC.KeepAlive(this);
}
}
...
}
बात है कि मुझे परेशान करना यह है - वे दो बार m_handle की वैधता की जांच क्यों कर रहे हैं? विशेष रूप से 'सेट' विधि में - विधि के अंत में GC.KeepAlive के उपयोग की जा रही कचरा एकत्र से WeakReference रखना चाहिए, और इस तरह संभाल रखने गैर शून्य - है ना?
और इन के मामले 'प्राप्त' - एक बार हम वास्तव में, InternalGet के माध्यम से लक्ष्य के लिए एक संदर्भ लिया गया गया है क्यों मूल m_handle मूल्य फिर से जाँच परेशान? , लेकिन निश्चित रूप से यह भी निपटारा नहीं किया जा सका और अंतिम रूप दिया इससे पहले कि हम वस्तु लौटने के लिए चारों ओर पाने के - सभी मुझे लगता है कि कर सकते हैं कि शायद वे WeakReference से सुरक्षा के लिए निपटाया और के दौरान या InternalGet बाद अंतिम रूप दिया जा रहा है की कोशिश कर रहे है? मैं सिर्फ डब्ल्यू/क्यों इस तरह जांचना यहाँ आवश्यक है के रूप में एक वैध स्पष्टीकरण आया नहीं कर सकते हैं ...
आप कार्यान्वयन इतना क्यों ध्यान करते हैं? और क्या यह वास्तविक माइक्रोसॉफ्ट लाइसेंस प्राप्त कोड है जिसे आप पोस्ट कर रहे हैं, या क्या यह मोनो है? – Dykam
+1 अच्छा सवाल। किसी भी एक्सेसर्स में ज्यादा समझ में नहीं आता है। – Groo
@ डिकम रीडिंग कोड सीखने का एक शानदार तरीका है, और लाइब्रेरी कोड को "जादू" के रूप में पढ़ना एक शानदार तरीका है जो सीखना और अंधविश्वास विकसित करना नहीं है। साथ ही, मुझे यह सोचने से नफरत होगी कि यह स्निपेट निष्पक्ष उपयोग के तहत नहीं आती है, भले ही यह कॉपीराइट हो। –