Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / 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) { } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ByteStorage.cs
- HashAlgorithm.cs
- UdpTransportSettingsElement.cs
- DefaultObjectMappingItemCollection.cs
- CodeAccessSecurityEngine.cs
- TimelineClockCollection.cs
- UICuesEvent.cs
- TypeUtils.cs
- _SslState.cs
- GZipDecoder.cs
- IFlowDocumentViewer.cs
- DCSafeHandle.cs
- ClusterRegistryConfigurationProvider.cs
- UnknownBitmapEncoder.cs
- PersonalizableTypeEntry.cs
- LineSegment.cs
- ProxyAttribute.cs
- ContainerActivationHelper.cs
- EditorResources.cs
- MimeReturn.cs
- WebPartEditorApplyVerb.cs
- Int32KeyFrameCollection.cs
- VariableQuery.cs
- SettingsAttributes.cs
- CharAnimationUsingKeyFrames.cs
- Canonicalizers.cs
- DetailsView.cs
- UTF32Encoding.cs
- CacheDependency.cs
- ContractNamespaceAttribute.cs
- MatrixAnimationBase.cs
- ProviderUtil.cs
- PlainXmlWriter.cs
- WorkflowPrinting.cs
- DeviceContext2.cs
- AttachedPropertyDescriptor.cs
- JsonDataContract.cs
- ShaderEffect.cs
- SqlBooleanizer.cs
- SafeFindHandle.cs
- XPathScanner.cs
- StructuredType.cs
- JsonFaultDetail.cs
- MenuItem.cs
- unsafenativemethodsother.cs
- TabletDeviceInfo.cs
- PropertyCollection.cs
- DateTimeAutomationPeer.cs
- WebScriptClientGenerator.cs
- ChannelOptions.cs
- DiscoveryDocumentSerializer.cs
- ObjectItemConventionAssemblyLoader.cs
- Trace.cs
- EventLogReader.cs
- StandardOleMarshalObject.cs
- KeyNotFoundException.cs
- XmlParser.cs
- ArrayExtension.cs
- XmlValidatingReader.cs
- TextInfo.cs
- AffineTransform3D.cs
- EmptyEnumerable.cs
- Literal.cs
- DBDataPermissionAttribute.cs
- EncryptedData.cs
- X509RawDataKeyIdentifierClause.cs
- FocusChangedEventArgs.cs
- XslCompiledTransform.cs
- SiteMapNodeItem.cs
- ListViewGroupCollectionEditor.cs
- UnknownBitmapEncoder.cs
- ExpandSegment.cs
- RequestSecurityToken.cs
- CombinedGeometry.cs
- WhiteSpaceTrimStringConverter.cs
- OdbcConnectionHandle.cs
- SqlInfoMessageEvent.cs
- CompilationSection.cs
- XmlDataSourceNodeDescriptor.cs
- SrgsElementFactory.cs
- CompilationLock.cs
- ClassicBorderDecorator.cs
- TextTreeTextBlock.cs
- Query.cs
- OleDbParameter.cs
- FrameworkReadOnlyPropertyMetadata.cs
- TabItem.cs
- NameValueCollection.cs
- PropertyDescriptorComparer.cs
- TextEndOfParagraph.cs
- PropertyCollection.cs
- BasicCellRelation.cs
- BoundingRectTracker.cs
- NumericUpDownAccelerationCollection.cs
- XmlSerializerOperationGenerator.cs
- GPRECT.cs
- RenderData.cs
- ellipse.cs
- RegistrationServices.cs
- WebPartDescription.cs