Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Base / MS / Internal / BaseHashHelper.cs / 1 / 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 `blacklist 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 `blacklist 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
- HandlerMappingMemo.cs
- SocketAddress.cs
- RouteParser.cs
- ServiceDescriptionImporter.cs
- ConfigurationLockCollection.cs
- TypeBuilder.cs
- CommandLineParser.cs
- DateBoldEvent.cs
- PersonalizationAdministration.cs
- KnownBoxes.cs
- MobileResource.cs
- BindableAttribute.cs
- SecurityUtils.cs
- _HelperAsyncResults.cs
- IImplicitResourceProvider.cs
- PolyQuadraticBezierSegment.cs
- SystemFonts.cs
- DataTableClearEvent.cs
- _SSPIWrapper.cs
- CopyOfAction.cs
- XmlSchemaElement.cs
- ContextMenu.cs
- RewritingSimplifier.cs
- HyperLinkStyle.cs
- NetworkAddressChange.cs
- PropertyConverter.cs
- DynamicFilter.cs
- DefaultProxySection.cs
- ScopedKnownTypes.cs
- BaseDataList.cs
- ServiceSettingsResponseInfo.cs
- EntitySqlQueryCacheEntry.cs
- DataTemplateKey.cs
- CapabilitiesRule.cs
- ContainerParagraph.cs
- _ContextAwareResult.cs
- StreamGeometryContext.cs
- ConfigurationSection.cs
- DisableDpiAwarenessAttribute.cs
- ObjectSet.cs
- DbProviderSpecificTypePropertyAttribute.cs
- VariantWrapper.cs
- StorageBasedPackageProperties.cs
- StreamMarshaler.cs
- DataServiceQueryOfT.cs
- SHA1.cs
- PartialArray.cs
- ContentTextAutomationPeer.cs
- DataPagerCommandEventArgs.cs
- EmptyControlCollection.cs
- EventNotify.cs
- CodeTypeDeclarationCollection.cs
- Literal.cs
- BitmapPalette.cs
- EncoderParameter.cs
- GenericIdentity.cs
- SQLRoleProvider.cs
- XamlGridLengthSerializer.cs
- DragDrop.cs
- WindowsIdentity.cs
- CodeCompileUnit.cs
- ElapsedEventArgs.cs
- NullableDoubleAverageAggregationOperator.cs
- ServiceNotStartedException.cs
- dataSvcMapFileLoader.cs
- MarkupExtensionSerializer.cs
- MouseOverProperty.cs
- externdll.cs
- FunctionCommandText.cs
- WebColorConverter.cs
- EditorPartCollection.cs
- BufferBuilder.cs
- InputLangChangeRequestEvent.cs
- StyleSelector.cs
- WebPartDisplayMode.cs
- TableRow.cs
- SmtpMail.cs
- ZipFileInfo.cs
- QueryableDataSourceHelper.cs
- SynchronizedInputAdaptor.cs
- ScrollChrome.cs
- FreezableCollection.cs
- BindToObject.cs
- RequestCachePolicyConverter.cs
- BufferedGraphics.cs
- WebZone.cs
- versioninfo.cs
- XmlSignificantWhitespace.cs
- TextTreeRootTextBlock.cs
- TabControl.cs
- PingReply.cs
- CssTextWriter.cs
- IPPacketInformation.cs
- UInt64Converter.cs
- FixedSOMSemanticBox.cs
- HttpAsyncResult.cs
- ManagementOperationWatcher.cs
- WebPartZone.cs
- FileDialogCustomPlacesCollection.cs
- FunctionDetailsReader.cs