ReadOnlyCollection.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Collections / ObjectModel / ReadOnlyCollection.cs / 1305376 / ReadOnlyCollection.cs

                            // ==++== 
//
//   Copyright (c) Microsoft Corporation.  All rights reserved.
//
// ==--== 
// [....]
// 
 
namespace System.Collections.ObjectModel
{ 
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Diagnostics; 
    using System.Runtime;
 
    [Serializable] 
    [System.Runtime.InteropServices.ComVisible(false)]
    [DebuggerTypeProxy(typeof(Mscorlib_CollectionDebugView<>))] 
    [DebuggerDisplay("Count = {Count}")]
    public class ReadOnlyCollection: IList, IList
    {
        IList list; 
        [NonSerialized]
        private Object _syncRoot; 
 
        public ReadOnlyCollection(IList list) {
            if (list == null) { 
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list);
            }
            this.list = list;
        } 

        public int Count { 
#if !FEATURE_CORECLR 
            [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
#endif 
            get { return list.Count; }
        }

        public T this[int index] { 
#if !FEATURE_CORECLR
            [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 
#endif 
            get { return list[index]; }
        } 

#if !FEATURE_CORECLR
        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
#endif 
        public bool Contains(T value) {
            return list.Contains(value); 
        } 

        public void CopyTo(T[] array, int index) { 
            list.CopyTo(array, index);
        }

#if !FEATURE_CORECLR 
        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
#endif 
        public IEnumerator GetEnumerator() { 
            return list.GetEnumerator();
        } 

        public int IndexOf(T value) {
            return list.IndexOf(value);
        } 

        protected IList Items { 
            get { 
                return list;
            } 
        }

        bool ICollection.IsReadOnly {
            get { return true; } 
        }
 
        T IList.this[int index] { 
            get { return list[index]; }
            set { 
                ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
            }
        }
 
        void ICollection.Add(T value) {
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection); 
        } 

        void ICollection.Clear() { 
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
        }

        void IList.Insert(int index, T value) { 
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
        } 
 
        bool ICollection.Remove(T value) {
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection); 
            return false;
        }

        void IList.RemoveAt(int index) { 
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
        } 
 
        IEnumerator IEnumerable.GetEnumerator() {
            return ((IEnumerable)list).GetEnumerator(); 
        }

        bool ICollection.IsSynchronized {
            get { return false; } 
        }
 
        object ICollection.SyncRoot { 
            get {
                if( _syncRoot == null) { 
                    ICollection c = list as ICollection;
                    if( c != null) {
                        _syncRoot = c.SyncRoot;
                    } 
                    else {
                        System.Threading.Interlocked.CompareExchange(ref _syncRoot, new Object(), null); 
                    } 
                }
                return _syncRoot; 
            }
        }

        void ICollection.CopyTo(Array array, int index) { 
            if (array==null) {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array); 
            } 

            if (array.Rank != 1) { 
                ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_RankMultiDimNotSupported);
            }

            if( array.GetLowerBound(0) != 0 ) { 
                ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_NonZeroLowerBound);
            } 
 
            if (index < 0) {
                ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.arrayIndex, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); 
            }

            if (array.Length - index < Count) {
                ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall); 
            }
 
            T[] items = array as T[]; 
            if (items != null) {
                list.CopyTo(items, index); 
            }
            else {
                //
                // Catch the obvious case assignment will fail. 
                // We can found all possible problems by doing the check though.
                // For example, if the element type of the Array is derived from T, 
                // we can't figure out if we can successfully copy the element beforehand. 
                //
                Type targetType = array.GetType().GetElementType(); 
                Type sourceType = typeof(T);
                if(!(targetType.IsAssignableFrom(sourceType) || sourceType.IsAssignableFrom(targetType))) {
                    ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
                } 

                // 
                // We can't cast array of value type to object[], so we don't support 
                // widening of primitive types here.
                // 
                object[] objects = array as object[];
                if( objects == null) {
                    ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
                } 

                int count = list.Count; 
                try { 
                    for (int i = 0; i < count; i++) {
                        objects[index++] = list[i]; 
                    }
                }
                catch(ArrayTypeMismatchException) {
                    ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType); 
                }
            } 
        } 

        bool IList.IsFixedSize { 
            get { return true; }
        }

        bool IList.IsReadOnly { 
            get { return true; }
        } 
 
        object IList.this[int index] {
#if !FEATURE_CORECLR 
            [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
#endif
            get { return list[index]; }
            set { 
                ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
            } 
        } 

        int IList.Add(object value) { 
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
            return -1;
        }
 
        void IList.Clear() {
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection); 
        } 

        private static bool IsCompatibleObject(object value) { 
            // Non-null values are fine.  Only accept nulls if T is a class or Nullable.
            // Note that default(T) is not equal to null for value types except when T is Nullable.
            return ((value is T) || (value == null && default(T) == null));
        } 

        bool IList.Contains(object value) { 
            if(IsCompatibleObject(value)) { 
                return Contains((T) value);
            } 
            return false;
        }

        int IList.IndexOf(object value) { 
            if(IsCompatibleObject(value)) {
                return IndexOf((T)value); 
            } 
            return -1;
        } 

        void IList.Insert(int index, object value) {
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
        } 

        void IList.Remove(object value) { 
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection); 
        }
 
        void IList.RemoveAt(int index) {
            ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

                        

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