Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Base / MS / Internal / BaseHashHelper.cs / 2 / BaseHashHelper.cs
//---------------------------------------------------------------------------- // //// Copyright (C) 2003 by Microsoft Corporation. All rights reserved. // // // // Description: Static class to help work around hashing-related bugs. // //--------------------------------------------------------------------------- using System; using System.Reflection; // Assembly using System.Collections.Specialized; // HybridDictionary using MS.Internal.WindowsBase; // [FriendAccessAllowed] namespace MS.Internal { [FriendAccessAllowed] // defined in Base, used in Core and Framework internal static class BaseHashHelper { static BaseHashHelper() { // register bad types from WindowsBase MS.Internal.Hashing.WindowsBase.HashHelper.Initialize(); } [FriendAccessAllowed] // defined in Base, used in Core and Framework internal static void RegisterTypes(Assembly assembly, Type[] types) { HybridDictionary dictionary = DictionaryFromList(types); lock(_table) { _table[assembly] = dictionary; } } // Some types don't have reliable hash codes - the hashcode can change // during the lifetime of an object of that type. Such an object cannot // be used as the key of a hashtable or dictionary. This is where we // detect such objects, so the caller can find some other way to cope. [FriendAccessAllowed] // defined in Base, used in Core and Framework internal static bool HasReliableHashCode(object item) { // null doesn't actually have a hashcode at all. This method can be // called with a representative item from a collection - if the // representative is null, we'll be pessimistic and assume the // items in the collection should not be hashed. if (item == null) return false; Type type = item.GetType(); Assembly assembly = type.Assembly; HybridDictionary dictionary; lock(_table) { dictionary = (HybridDictionary)_table[assembly]; } if (dictionary == null) { // if we don't have an entry for the object's assembly, // see if we know something about the assembly /* no external types on the block list any more if (type.Namespace == "System.Data" && IsSystemData(assembly)) { dictionary = TypesForSystemData(); } else */ { // if we don't know anything about the assembly, give it an // empty dictionary. This makes future lookups fast. We just // have to hope that every type in the assembly has reliable // hashcodes. dictionary = new HybridDictionary(); } lock(_table) { _table[assembly] = dictionary; } } return !dictionary.Contains(type); } // populate a dictionary from the given list private static HybridDictionary DictionaryFromList(Type[] types) { HybridDictionary dictionary = new HybridDictionary(types.Length); for (int i=0; i// Copyright (C) 2003 by Microsoft Corporation. All rights reserved. // // // // Description: Static class to help work around hashing-related bugs. // //--------------------------------------------------------------------------- using System; using System.Reflection; // Assembly using System.Collections.Specialized; // HybridDictionary using MS.Internal.WindowsBase; // [FriendAccessAllowed] namespace MS.Internal { [FriendAccessAllowed] // defined in Base, used in Core and Framework internal static class BaseHashHelper { static BaseHashHelper() { // register bad types from WindowsBase MS.Internal.Hashing.WindowsBase.HashHelper.Initialize(); } [FriendAccessAllowed] // defined in Base, used in Core and Framework internal static void RegisterTypes(Assembly assembly, Type[] types) { HybridDictionary dictionary = DictionaryFromList(types); lock(_table) { _table[assembly] = dictionary; } } // Some types don't have reliable hash codes - the hashcode can change // during the lifetime of an object of that type. Such an object cannot // be used as the key of a hashtable or dictionary. This is where we // detect such objects, so the caller can find some other way to cope. [FriendAccessAllowed] // defined in Base, used in Core and Framework internal static bool HasReliableHashCode(object item) { // null doesn't actually have a hashcode at all. This method can be // called with a representative item from a collection - if the // representative is null, we'll be pessimistic and assume the // items in the collection should not be hashed. if (item == null) return false; Type type = item.GetType(); Assembly assembly = type.Assembly; HybridDictionary dictionary; lock(_table) { dictionary = (HybridDictionary)_table[assembly]; } if (dictionary == null) { // if we don't have an entry for the object's assembly, // see if we know something about the assembly /* no external types on the block list any more if (type.Namespace == "System.Data" && IsSystemData(assembly)) { dictionary = TypesForSystemData(); } else */ { // if we don't know anything about the assembly, give it an // empty dictionary. This makes future lookups fast. We just // have to hope that every type in the assembly has reliable // hashcodes. dictionary = new HybridDictionary(); } lock(_table) { _table[assembly] = dictionary; } } return !dictionary.Contains(type); } // populate a dictionary from the given list private static HybridDictionary DictionaryFromList(Type[] types) { HybridDictionary dictionary = new HybridDictionary(types.Length); for (int i=0; i
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- GatewayDefinition.cs
- CreateParams.cs
- ISAPIApplicationHost.cs
- ConfigXmlText.cs
- KnownTypesProvider.cs
- DataSet.cs
- HttpCookieCollection.cs
- PageFunction.cs
- DesignSurfaceEvent.cs
- QueryValue.cs
- CompositeControl.cs
- UnsafeNativeMethods.cs
- MetadataHelper.cs
- Tile.cs
- WebUtil.cs
- TextSegment.cs
- backend.cs
- BrowserCapabilitiesCompiler.cs
- ApplicationId.cs
- XmlNamedNodeMap.cs
- DispatcherFrame.cs
- ResourcePart.cs
- DataGridTextBoxColumn.cs
- DeviceSpecificChoiceCollection.cs
- UnmanagedHandle.cs
- OracleTransaction.cs
- ConfigurationValidatorBase.cs
- RtfControls.cs
- DataStorage.cs
- IndexerNameAttribute.cs
- EnumMember.cs
- Evidence.cs
- RewritingValidator.cs
- DataGridViewColumnCollection.cs
- counter.cs
- DataGridViewBand.cs
- OleDbDataReader.cs
- ExtendedProtectionPolicyElement.cs
- FrameworkElement.cs
- ZipIOExtraFieldElement.cs
- AssemblyInfo.cs
- AnimatedTypeHelpers.cs
- TextBoxBase.cs
- RawStylusSystemGestureInputReport.cs
- IncrementalReadDecoders.cs
- PreviewKeyDownEventArgs.cs
- Parallel.cs
- ProcessModule.cs
- HttpCachePolicyElement.cs
- ContextConfiguration.cs
- EdmRelationshipRoleAttribute.cs
- EditorPartChrome.cs
- Animatable.cs
- ScrollEvent.cs
- Stack.cs
- DockProviderWrapper.cs
- Classification.cs
- PlaceHolder.cs
- Color.cs
- unsafenativemethodsother.cs
- RouteValueDictionary.cs
- ExecutedRoutedEventArgs.cs
- LinkedResource.cs
- Marshal.cs
- Assembly.cs
- _ChunkParse.cs
- NonParentingControl.cs
- ImagingCache.cs
- columnmapfactory.cs
- SystemIcmpV4Statistics.cs
- SqlError.cs
- MimeMapping.cs
- CallSite.cs
- MulticastIPAddressInformationCollection.cs
- CompoundFileStreamReference.cs
- UrlAuthorizationModule.cs
- TimelineClockCollection.cs
- OracleBFile.cs
- MarshalByValueComponent.cs
- SQLUtility.cs
- GlyphShapingProperties.cs
- Panel.cs
- filewebrequest.cs
- ObjectDataSourceStatusEventArgs.cs
- WebPartDisplayModeCancelEventArgs.cs
- Variable.cs
- EditingContext.cs
- ConfigurationHandlersInstallComponent.cs
- graph.cs
- PageAsyncTaskManager.cs
- CalloutQueueItem.cs
- CodeDirectiveCollection.cs
- NotifyInputEventArgs.cs
- TreeNodeStyle.cs
- XPathNode.cs
- DbBuffer.cs
- FieldToken.cs
- WebPartZoneCollection.cs
- MemoryMappedView.cs
- ResXDataNode.cs