WeakReferenceEnumerator.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Shared / MS / Internal / WeakReferenceEnumerator.cs / 1 / WeakReferenceEnumerator.cs

                            using System; 
using System.Collections;
using System.Windows;

#if WINDOWS_BASE 
    using MS.Internal.WindowsBase;
#elif PRESENTATION_CORE 
    using MS.Internal.PresentationCore; 
#elif PRESENTATIONFRAMEWORK
    using MS.Internal.PresentationFramework; 
#elif DRT
    using MS.Internal.Drt;
#else
#error Attempt to use FriendAccessAllowedAttribute from an unknown assembly. 
using MS.Internal.YourAssemblyName;
#endif 
 
// Disable pragma warnings to enable PREsharp pragmas
#pragma warning disable 1634, 1691 

namespace MS.Internal
{
    ///  
    ///    This allows callers to "foreach" through a WeakReferenceList.
    ///    Each weakreference is checked for liveness and "current" 
    ///    actually returns a strong reference to the current element. 
    /// 
    ///  
    ///    Due to the way enumerators function, this enumerator often
    ///    holds a cached strong reference to the "Current" element.
    ///    This should not be a problem unless the caller stops enumerating
    ///    before the end of the list AND holds the enumerator alive forever. 
    /// 
    [FriendAccessAllowed] 
    internal struct WeakReferenceListEnumerator : IEnumerator 
    {
        public WeakReferenceListEnumerator( ArrayList List) 
        {
            _i = 0;
            _List = List;
            _StrongReference = null; 
        }
 
        object IEnumerator.Current 
        {  get{ return Current; } }
 
        public object Current
        {
            get
            { 
                if( null == _StrongReference )
                { 
#pragma warning suppress 6503 
                    throw new System.InvalidOperationException(SR.Get(SRID.Enumerator_VerifyContext));
                } 
                return _StrongReference;
            }
        }
 
        public bool MoveNext()
        { 
            object obj=null; 
            while( _i < _List.Count )
            { 
                WeakReference weakRef = (WeakReference) _List[ _i++ ];
                obj = weakRef.Target;
                if(null != obj)
                    break; 
            }
            _StrongReference = obj; 
            return (null != obj); 
        }
 
        public void Reset()
        {
            _i = 0;
            _StrongReference = null; 
        }
 
        int _i; 
        ArrayList _List;
        object _StrongReference; 
    }
}


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System; 
using System.Collections;
using System.Windows;

#if WINDOWS_BASE 
    using MS.Internal.WindowsBase;
#elif PRESENTATION_CORE 
    using MS.Internal.PresentationCore; 
#elif PRESENTATIONFRAMEWORK
    using MS.Internal.PresentationFramework; 
#elif DRT
    using MS.Internal.Drt;
#else
#error Attempt to use FriendAccessAllowedAttribute from an unknown assembly. 
using MS.Internal.YourAssemblyName;
#endif 
 
// Disable pragma warnings to enable PREsharp pragmas
#pragma warning disable 1634, 1691 

namespace MS.Internal
{
    ///  
    ///    This allows callers to "foreach" through a WeakReferenceList.
    ///    Each weakreference is checked for liveness and "current" 
    ///    actually returns a strong reference to the current element. 
    /// 
    ///  
    ///    Due to the way enumerators function, this enumerator often
    ///    holds a cached strong reference to the "Current" element.
    ///    This should not be a problem unless the caller stops enumerating
    ///    before the end of the list AND holds the enumerator alive forever. 
    /// 
    [FriendAccessAllowed] 
    internal struct WeakReferenceListEnumerator : IEnumerator 
    {
        public WeakReferenceListEnumerator( ArrayList List) 
        {
            _i = 0;
            _List = List;
            _StrongReference = null; 
        }
 
        object IEnumerator.Current 
        {  get{ return Current; } }
 
        public object Current
        {
            get
            { 
                if( null == _StrongReference )
                { 
#pragma warning suppress 6503 
                    throw new System.InvalidOperationException(SR.Get(SRID.Enumerator_VerifyContext));
                } 
                return _StrongReference;
            }
        }
 
        public bool MoveNext()
        { 
            object obj=null; 
            while( _i < _List.Count )
            { 
                WeakReference weakRef = (WeakReference) _List[ _i++ ];
                obj = weakRef.Target;
                if(null != obj)
                    break; 
            }
            _StrongReference = obj; 
            return (null != obj); 
        }
 
        public void Reset()
        {
            _i = 0;
            _StrongReference = null; 
        }
 
        int _i; 
        ArrayList _List;
        object _StrongReference; 
    }
}


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK