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
- TreeBuilder.cs
- XmlSchemaDatatype.cs
- ControlAdapter.cs
- TypeDefinition.cs
- PeerNameRecordCollection.cs
- QilInvokeEarlyBound.cs
- PageAdapter.cs
- DataGridViewEditingControlShowingEventArgs.cs
- Metadata.cs
- ExceptionRoutedEventArgs.cs
- UriScheme.cs
- Vector3dCollection.cs
- RubberbandSelector.cs
- NestPullup.cs
- Run.cs
- ZipIOCentralDirectoryBlock.cs
- WebReferencesBuildProvider.cs
- CultureTableRecord.cs
- ControlPaint.cs
- FixedSOMTextRun.cs
- PropertyBuilder.cs
- SqlWebEventProvider.cs
- DoubleUtil.cs
- PersistenceTask.cs
- GACMembershipCondition.cs
- StatusBarPanel.cs
- MetadataCache.cs
- Rectangle.cs
- XPathNodePointer.cs
- DBCommand.cs
- DecimalSumAggregationOperator.cs
- SqlRowUpdatedEvent.cs
- serverconfig.cs
- DataGridViewRowCollection.cs
- Vector3D.cs
- OutputCacheProfileCollection.cs
- ImageListStreamer.cs
- KeyGestureValueSerializer.cs
- DataGridTextBox.cs
- CheckBox.cs
- XmlDataSourceNodeDescriptor.cs
- Storyboard.cs
- KeyManager.cs
- DuplicateWaitObjectException.cs
- StorageComplexPropertyMapping.cs
- InfoCardClaim.cs
- UIElementPropertyUndoUnit.cs
- WebCodeGenerator.cs
- SystemDiagnosticsSection.cs
- ReferenceTypeElement.cs
- FillRuleValidation.cs
- MetadataPropertyAttribute.cs
- ReferentialConstraintRoleElement.cs
- UInt64Converter.cs
- DataListAutoFormat.cs
- FrameworkElementFactoryMarkupObject.cs
- InvalidComObjectException.cs
- MouseButton.cs
- ZoneIdentityPermission.cs
- DeviceContext2.cs
- PrefixHandle.cs
- XPathDocumentIterator.cs
- UnsafeNativeMethods.cs
- BitStream.cs
- EntityDataSourceChangedEventArgs.cs
- OleDbError.cs
- LocatorGroup.cs
- TypeConverterValueSerializer.cs
- ListViewGroupItemCollection.cs
- ParallelDesigner.cs
- ResourceProviderFactory.cs
- ZipIOExtraFieldElement.cs
- X509ChainPolicy.cs
- XmlSchemaObjectCollection.cs
- XamlFigureLengthSerializer.cs
- ClassDataContract.cs
- DispatchWrapper.cs
- HtmlInputHidden.cs
- RecommendedAsConfigurableAttribute.cs
- StreamWriter.cs
- XmlQueryTypeFactory.cs
- InOutArgumentConverter.cs
- CollectionType.cs
- AvtEvent.cs
- WebPartAuthorizationEventArgs.cs
- prompt.cs
- xdrvalidator.cs
- SqlClientWrapperSmiStream.cs
- Shape.cs
- WorkflowRuntimeSection.cs
- SqlCachedBuffer.cs
- PrintController.cs
- D3DImage.cs
- TypeDescriptionProvider.cs
- HostingEnvironmentWrapper.cs
- XmlDocument.cs
- LinqDataView.cs
- StyleXamlParser.cs
- ChangeDirector.cs
- ValidationError.cs