Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / Collections / DictionaryBase.cs / 1 / DictionaryBase.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //------------------------------------------------------------------------------ //----------------------------------------------------------------------------- namespace System.Collections { using System; using System.Security.Permissions; // Useful base class for typed read/write collections where items derive from object [Serializable] [System.Runtime.InteropServices.ComVisible(true)] public abstract class DictionaryBase : IDictionary { Hashtable hashtable; protected Hashtable InnerHashtable { get { if (hashtable == null) hashtable = new Hashtable(); return hashtable; } } protected IDictionary Dictionary { get { return (IDictionary) this; } } public int Count { // to avoid newing inner list if no items are ever added get { return hashtable == null ? 0 : hashtable.Count; } } bool IDictionary.IsReadOnly { get { return InnerHashtable.IsReadOnly; } } bool IDictionary.IsFixedSize { get { return InnerHashtable.IsFixedSize; } } bool ICollection.IsSynchronized { get { return InnerHashtable.IsSynchronized; } } ICollection IDictionary.Keys { get { return InnerHashtable.Keys; } } Object ICollection.SyncRoot { get { return InnerHashtable.SyncRoot; } } ICollection IDictionary.Values { get { return InnerHashtable.Values; } } public void CopyTo(Array array, int index) { InnerHashtable.CopyTo(array, index); } object IDictionary.this[object key] { get { object currentValue = InnerHashtable[key]; OnGet(key, currentValue); return currentValue; } set { OnValidate(key, value); bool keyExists = true; Object temp = InnerHashtable[key]; if( temp == null) { keyExists = InnerHashtable.Contains(key); } OnSet(key, temp, value); InnerHashtable[key] = value; try { OnSetComplete(key, temp, value); } catch { if( keyExists) { InnerHashtable[key] = temp; } else { InnerHashtable.Remove(key); } throw; } } } bool IDictionary.Contains(object key) { return InnerHashtable.Contains(key); } void IDictionary.Add(object key, object value) { OnValidate(key, value); OnInsert(key, value); InnerHashtable.Add(key, value); try { OnInsertComplete(key, value); } catch { InnerHashtable.Remove(key); throw; } } public void Clear() { OnClear(); InnerHashtable.Clear(); OnClearComplete(); } void IDictionary.Remove(object key) { if(InnerHashtable.Contains(key)) { Object temp = InnerHashtable[key]; OnValidate(key, temp); OnRemove(key, temp); InnerHashtable.Remove(key); try { OnRemoveComplete(key, temp); } catch { InnerHashtable.Add(key, temp); throw; } } } public IDictionaryEnumerator GetEnumerator() { return InnerHashtable.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return InnerHashtable.GetEnumerator(); } protected virtual object OnGet(object key, object currentValue) { return currentValue; } protected virtual void OnSet(object key, object oldValue, object newValue) { } protected virtual void OnInsert(object key, object value) { } protected virtual void OnClear() { } protected virtual void OnRemove(object key, object value) { } protected virtual void OnValidate(object key, object value) { } protected virtual void OnSetComplete(object key, object oldValue, object newValue) { } protected virtual void OnInsertComplete(object key, object value) { } protected virtual void OnClearComplete() { } protected virtual void OnRemoveComplete(object key, object value) { } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //------------------------------------------------------------------------------ //----------------------------------------------------------------------------- namespace System.Collections { using System; using System.Security.Permissions; // Useful base class for typed read/write collections where items derive from object [Serializable] [System.Runtime.InteropServices.ComVisible(true)] public abstract class DictionaryBase : IDictionary { Hashtable hashtable; protected Hashtable InnerHashtable { get { if (hashtable == null) hashtable = new Hashtable(); return hashtable; } } protected IDictionary Dictionary { get { return (IDictionary) this; } } public int Count { // to avoid newing inner list if no items are ever added get { return hashtable == null ? 0 : hashtable.Count; } } bool IDictionary.IsReadOnly { get { return InnerHashtable.IsReadOnly; } } bool IDictionary.IsFixedSize { get { return InnerHashtable.IsFixedSize; } } bool ICollection.IsSynchronized { get { return InnerHashtable.IsSynchronized; } } ICollection IDictionary.Keys { get { return InnerHashtable.Keys; } } Object ICollection.SyncRoot { get { return InnerHashtable.SyncRoot; } } ICollection IDictionary.Values { get { return InnerHashtable.Values; } } public void CopyTo(Array array, int index) { InnerHashtable.CopyTo(array, index); } object IDictionary.this[object key] { get { object currentValue = InnerHashtable[key]; OnGet(key, currentValue); return currentValue; } set { OnValidate(key, value); bool keyExists = true; Object temp = InnerHashtable[key]; if( temp == null) { keyExists = InnerHashtable.Contains(key); } OnSet(key, temp, value); InnerHashtable[key] = value; try { OnSetComplete(key, temp, value); } catch { if( keyExists) { InnerHashtable[key] = temp; } else { InnerHashtable.Remove(key); } throw; } } } bool IDictionary.Contains(object key) { return InnerHashtable.Contains(key); } void IDictionary.Add(object key, object value) { OnValidate(key, value); OnInsert(key, value); InnerHashtable.Add(key, value); try { OnInsertComplete(key, value); } catch { InnerHashtable.Remove(key); throw; } } public void Clear() { OnClear(); InnerHashtable.Clear(); OnClearComplete(); } void IDictionary.Remove(object key) { if(InnerHashtable.Contains(key)) { Object temp = InnerHashtable[key]; OnValidate(key, temp); OnRemove(key, temp); InnerHashtable.Remove(key); try { OnRemoveComplete(key, temp); } catch { InnerHashtable.Add(key, temp); throw; } } } public IDictionaryEnumerator GetEnumerator() { return InnerHashtable.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return InnerHashtable.GetEnumerator(); } protected virtual object OnGet(object key, object currentValue) { return currentValue; } protected virtual void OnSet(object key, object oldValue, object newValue) { } protected virtual void OnInsert(object key, object value) { } protected virtual void OnClear() { } protected virtual void OnRemove(object key, object value) { } protected virtual void OnValidate(object key, object value) { } protected virtual void OnSetComplete(object key, object oldValue, object newValue) { } protected virtual void OnInsertComplete(object key, object value) { } protected virtual void OnClearComplete() { } protected virtual void OnRemoveComplete(object key, object value) { } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- OptionalRstParameters.cs
- LocalizableAttribute.cs
- PageParserFilter.cs
- SpecularMaterial.cs
- ViewgenGatekeeper.cs
- DataGridHeaderBorder.cs
- MultiplexingDispatchMessageFormatter.cs
- OutputCacheModule.cs
- DataTemplateKey.cs
- DataGridViewRowConverter.cs
- _HeaderInfo.cs
- XpsPackagingPolicy.cs
- FileClassifier.cs
- NullableDoubleSumAggregationOperator.cs
- TemplatedWizardStep.cs
- DataListItemCollection.cs
- AssemblyBuilder.cs
- CredentialCache.cs
- FormViewCommandEventArgs.cs
- ClientData.cs
- ReadWriteObjectLock.cs
- CodeIdentifiers.cs
- Context.cs
- XPathChildIterator.cs
- ReflectionServiceProvider.cs
- ToolStripDropDownButton.cs
- GeometryDrawing.cs
- InfoCardArgumentException.cs
- WrappedIUnknown.cs
- InfiniteIntConverter.cs
- AdjustableArrowCap.cs
- MarshalByRefObject.cs
- Page.cs
- TaiwanLunisolarCalendar.cs
- COM2PictureConverter.cs
- XmlRawWriter.cs
- SelectedGridItemChangedEvent.cs
- LocalizableResourceBuilder.cs
- SqlDataSource.cs
- ObjectParameterCollection.cs
- FixedStringLookup.cs
- ConsoleCancelEventArgs.cs
- CompilationLock.cs
- MsmqBindingElementBase.cs
- CheckPair.cs
- SqlBooleanizer.cs
- PropertyInformationCollection.cs
- LoopExpression.cs
- WorkflowServiceHost.cs
- DataGridViewRowConverter.cs
- BulletChrome.cs
- ToolStripItemImageRenderEventArgs.cs
- FormatterServices.cs
- PropertyPath.cs
- _NetworkingPerfCounters.cs
- NameValueCollection.cs
- PathGeometry.cs
- CompareInfo.cs
- VisualStyleTypesAndProperties.cs
- TreeViewItem.cs
- ScopelessEnumAttribute.cs
- RightsManagementPermission.cs
- Tool.cs
- DetailsViewDesigner.cs
- WorkflowRequestContext.cs
- LOSFormatter.cs
- Light.cs
- SettingsPropertyValueCollection.cs
- GenerateTemporaryTargetAssembly.cs
- WindowsListViewSubItem.cs
- PropertyStore.cs
- AutomationProperty.cs
- SqlPersonalizationProvider.cs
- HtmlElementCollection.cs
- XPathDocumentNavigator.cs
- ValueConversionAttribute.cs
- BoundColumn.cs
- EdmMember.cs
- EraserBehavior.cs
- OracleBinary.cs
- DeferredElementTreeState.cs
- OpCellTreeNode.cs
- ProtocolsSection.cs
- TextStore.cs
- CompositeKey.cs
- Internal.cs
- XmlNamedNodeMap.cs
- CreateUserWizard.cs
- EntityContainerEntitySet.cs
- SecurityContext.cs
- EarlyBoundInfo.cs
- MimeWriter.cs
- Matrix3DValueSerializer.cs
- MultipleViewPattern.cs
- MetafileHeader.cs
- TextHidden.cs
- MouseWheelEventArgs.cs
- AspNetHostingPermission.cs
- HostingEnvironmentException.cs
- RelationshipEnd.cs