C# CollectionBase源代码

来源:互联网 发布:mac 从前往后删除 编辑:程序博客网 时间:2024/05/29 11:30


namespace System.Collections {
    using System;
    using System.Diagnostics.Contracts;
  
    // Useful base class for typed read/write collections where items derive from object
    [Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
    public abstract class  CollectionBase : IList {
        ArrayList list;
 
        protected  CollectionBase() {
            list = new  ArrayList();
        }
 
        protected  CollectionBase(int capacity) {
            list = new  ArrayList(capacity);
        }
  
 
        protected  ArrayList InnerList {
            get {
                if (list == null)
                    list = new  ArrayList();
                return list;
            }
        }
  
        protected  IList List {
            get return (IList)this; }
        }
  
        [System.Runtime.InteropServices.ComVisible(false)]
        public int  Capacity {
            get {
                return  InnerList.Capacity;
            }
            set {
                InnerList.Capacity = value;
            }
        }
 
  
        public int Count {
            get {
                return list == null ? 0 : list.Count;
            }
        }
 
        public  void  Clear() {
            OnClear();
            InnerList.Clear();
            OnClearComplete();
        }
  
        public  void  RemoveAt(int index) {
            if (index < 0 || index >= Count)
                throw  new  ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
            Contract.End ContractBlock();
            Object temp = InnerList[index];
            OnValidate(temp);
            OnRemove(index, temp);
            InnerList.RemoveAt(index);
            try {
                OnRemoveComplete(index, temp);
            }
            catch {
                InnerList.Insert(index, temp);
                throw;
            }
  
        }
  
        bool  IList.IsReadOnly {
            get return  InnerList.IsReadOnly; }
        }
  
        bool  IList.IsFixedSize {
            get return  InnerList.IsFixedSize; }
        }
 
        bool  ICollection.IsSynchronized {
            get return  InnerList.IsSynchronized; }
        }
 
        Object ICollection.SyncRoot {
            get return  InnerList.SyncRoot; }
        }
  
        void  ICollection.CopyTo(Array array, int index) {
            InnerList.CopyTo(array, index);
        }
 
        Object IList.this[int index] {
            get {
                if (index < 0 || index >= Count)
                    throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
                Contract.EndContractBlock();
                return  InnerList[index];
            }
            set {
                if (index < 0 || index >= Count)
                    throw  new  ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
                Contract.End ContractBlock();
                OnValidate(value);
                Object temp = InnerList[index];
                OnSet(index, temp, value);
                InnerList[index] = value;
                try {
                    OnSetComplete(index, temp, value);
                }
                catch {
                    InnerList[index] = temp;
                    throw;
                }
            }
        }
  
        bool IList.Contains(Object value) {
            return  InnerList.Contains(value);
        }
  
        int  IList.Add(Object value) {
             OnValidate(value);
             OnInsert(InnerList.Count, value);
            int  index = InnerList.Add(value);
            try {
                OnInsertComplete(index, value);
            }
            catch {
                InnerList.RemoveAt(index);
                throw;
            }
            return index;
        }
  
 
        void  IList.Remove(Object value) {
             OnValidate(value);
            int  index = InnerList.IndexOf(value);
            if (index < 0) throw  new ArgumentException(Environment.GetResourceString("Arg_RemoveArgNotFound"));
            OnRemove(index, value);
            InnerList.RemoveAt(index);
            try{
                OnRemoveComplete(index, value);
            }
            catch {
                InnerList.Insert(index, value);
                throw;
            }
        }
  
        int IList.IndexOf(Object value) {
            return InnerList.IndexOf(value);
        }
 
        void IList.Insert(int index, Object value) {
            if (index < 0 || index > Count)
                throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
            Contract.EndContractBlock();
            OnValidate(value);
            OnInsert(index, value);
            InnerList.Insert(index, value);
            try {
                OnInsertComplete(index, value);
            }
            catch {
                InnerList.RemoveAt(index);
                throw;
            }
        }
  
        public IEnumerator GetEnumerator() {
            return InnerList.GetEnumerator();
        }
  
        protected virtual void OnSet(int index, Object oldValue, Object newValue) {
        }
  
        protected virtual void OnInsert(int index, Object value) {
        }
 
        protected virtual void  OnClear() {
        }
  
        protected virtual void OnRemove(int index, Object value) {
        }
  
        protected virtual void OnValidate(Object value) {
            if (value == nullthrow new ArgumentNullException("value");
            Contract.EndContractBlock();
        }
 
        protected virtual void OnSetComplete(int index, Object oldValue, Object newValue) {
        }
  
        protected virtual void OnInsertComplete(int index, Object value) {
        }
  
        protected virtual void OnClearComplete() {
        }
 
        protected virtual void OnRemoveComplete(int index, Object value) {
        }
  
    }
 
}
namespace System.Collections {
    using System;
    using System.Diagnostics.Contracts;
  
    // Useful base class for typed read/write collections where items derive from object
    [Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
    public abstract class CollectionBase : IList {
        ArrayList list;
 
        protected CollectionBase() {
            list = new ArrayList();
        }
 
        protected CollectionBase(int capacity) {
            list = new ArrayList(capacity);
        }
  
 
        protected ArrayList InnerList {
            get {
                if (list == null)
                    list = new ArrayList();
                return list;
            }
        }
  
        protected IList List {
            get return (IList)this; }
        }
  
        [System.Runtime.InteropServices.ComVisible(false)]
        public int Capacity {
            get {
                return InnerList.Capacity;
            }
            set {
                InnerList.Capacity = value;
            }
        }
 
  
        public int Count {
            get {
                return list == null ? 0 : list.Count;
            }
        }
 
        public void Clear() {
            OnClear();
            InnerList.Clear();
            OnClearComplete();
        }
  
        public void RemoveAt(int index) {
            if (index < 0 || index >= Count)
                throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
            Contract.EndContractBlock();
            Object temp = InnerList[index];
            OnValidate(temp);
            OnRemove(index, temp);
            InnerList.RemoveAt(index);
            try {
                OnRemoveComplete(index, temp);
            }
            catch {
                InnerList.Insert(index, temp);
                throw;
            }
  
        }
  
        bool IList.IsReadOnly {
            get return InnerList.IsReadOnly; }
        }
  
        bool IList.IsFixedSize {
            get return InnerList.IsFixedSize; }
        }
 
        bool ICollection.IsSynchronized {
            get return InnerList.IsSynchronized; }
        }
 
        Object ICollection.SyncRoot {
            get return InnerList.SyncRoot; }
        }
  
        void ICollection.CopyTo(Array array, int index) {
            InnerList.CopyTo(array, index);
        }
 
        Object IList.this[int index] {
            get {
                if (index < 0 || index >= Count)
                    throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
                Contract.EndContractBlock();
                return InnerList[index];
            }
            set {
                if (index < 0 || index >= Count)
                    throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
                Contract.EndContractBlock();
                OnValidate(value);
                Object temp = InnerList[index];
                OnSet(index, temp, value);
                InnerList[index] = value;
                try {
                    OnSetComplete(index, temp, value);
                }
                catch {
                    InnerList[index] = temp;
                    throw;
                }
            }
        }
  
        bool IList.Contains(Object value) {
            return InnerList.Contains(value);
        }
  
        int IList.Add(Object value) {
            OnValidate(value);
            OnInsert(InnerList.Count, value);
            int index = InnerList.Add(value);
            try {
                OnInsertComplete(index, value);
            }
            catch {
                InnerList.RemoveAt(index);
                throw;
            }
            return index;
        }
  
 
        void IList.Remove(Object value) {
            OnValidate(value);
            int index = InnerList.IndexOf(value);
            if (index < 0) throw newArgumentException(Environment.GetResourceString("Arg_RemoveArgNotFound"));
            OnRemove(index, value);
            InnerList.RemoveAt(index);
            try{
                OnRemoveComplete(index, value);
            }
            catch {
                InnerList.Insert(index, value);
                throw;
            }
        }
  
        int IList.IndexOf(Object value) {
            return InnerList.IndexOf(value);
        }
 
        void IList.Insert(int index, Object value) {
            if (index < 0 || index > Count)
                throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
            Contract.EndContractBlock();
            OnValidate(value);
            OnInsert(index, value);
            InnerList.Insert(index, value);
            try {
                OnInsertComplete(index, value);
            }
            catch {
                InnerList.RemoveAt(index);
                throw;
            }
        }
  
        public IEnumerator GetEnumerator() {
            return InnerList.GetEnumerator();
        }
  
        protected virtual void OnSet(int index, Object oldValue, Object newValue) {
        }
  
        protected virtual void OnInsert(int index, Object value) {
        }
 
        protected virtual void OnClear() {
        }
  
        protected virtual void OnRemove(int index, Object value) {
        }
  
        protected virtual void OnValidate(Object value) {
            if (value == nullthrow new ArgumentNullException("value");
            Contract.EndContractBlock();
        }
 
        protected virtual void OnSetComplete(int index, Object oldValue, Object newValue) {
        }
  
        protected virtual void OnInsertComplete(int index, Object value) {
        }
  
        protected virtual void OnClearComplete() {
        }
 
        protected virtual void OnRemoveComplete(int index, Object value) {
        }
  
    }
 
}
0 0
原创粉丝点击