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
- Simplifier.cs
- AssociationType.cs
- RequestCachePolicyConverter.cs
- SafeArchiveContext.cs
- ObjectNotFoundException.cs
- ErrorRuntimeConfig.cs
- SmtpAuthenticationManager.cs
- EmptyEnumerator.cs
- RewritingPass.cs
- TreeChangeInfo.cs
- PLINQETWProvider.cs
- SerializationException.cs
- Operator.cs
- WindowsFormsLinkLabel.cs
- HeaderedItemsControl.cs
- COM2EnumConverter.cs
- _ListenerAsyncResult.cs
- SymbolType.cs
- ValidatorCompatibilityHelper.cs
- ComponentDispatcherThread.cs
- ResourceManager.cs
- XamlSerializerUtil.cs
- PropertyToken.cs
- WebScriptMetadataMessage.cs
- DocumentGridContextMenu.cs
- CollectionViewGroupRoot.cs
- DataObjectCopyingEventArgs.cs
- PersonalizationStateInfoCollection.cs
- XmlAnyElementAttribute.cs
- querybuilder.cs
- AddDataControlFieldDialog.cs
- TaskDesigner.cs
- ClientScriptManager.cs
- HebrewCalendar.cs
- StringValueSerializer.cs
- dataprotectionpermissionattribute.cs
- TemplateInstanceAttribute.cs
- ZoneButton.cs
- ClientConfigPaths.cs
- RubberbandSelector.cs
- MissingFieldException.cs
- TextRunCache.cs
- Bidi.cs
- GeometryDrawing.cs
- HierarchicalDataTemplate.cs
- panel.cs
- HttpProcessUtility.cs
- XmlValidatingReader.cs
- Crc32Helper.cs
- Point3DCollection.cs
- HashStream.cs
- FillBehavior.cs
- ExpressionTextBox.xaml.cs
- ResourceDescriptionAttribute.cs
- ApplicationDirectoryMembershipCondition.cs
- ProjectionAnalyzer.cs
- XmlAtomicValue.cs
- MatrixTransform.cs
- SRGSCompiler.cs
- AlphabeticalEnumConverter.cs
- AssemblyCache.cs
- ClientSettings.cs
- baseaxisquery.cs
- TransactionProtocolConverter.cs
- DictionaryCustomTypeDescriptor.cs
- ExpandButtonVisibilityConverter.cs
- ReflectionPermission.cs
- EventOpcode.cs
- MessageAction.cs
- NetworkInformationException.cs
- BuildProvider.cs
- ValidationErrorEventArgs.cs
- KeyNotFoundException.cs
- ProviderSettingsCollection.cs
- TagNameToTypeMapper.cs
- NativeMethods.cs
- ConnectionPointCookie.cs
- Roles.cs
- ConfigXmlComment.cs
- PartitionerStatic.cs
- PartialList.cs
- ServiceModelConfigurationSectionGroup.cs
- SortedSet.cs
- PromptBuilder.cs
- PropertyGeneratedEventArgs.cs
- keycontainerpermission.cs
- XmlDictionaryWriter.cs
- MimeAnyImporter.cs
- ResourceExpressionBuilder.cs
- BulletDecorator.cs
- BinaryUtilClasses.cs
- WindowsTitleBar.cs
- SystemBrushes.cs
- SafeReversePInvokeHandle.cs
- PropertyGrid.cs
- WmlValidatorAdapter.cs
- TTSEvent.cs
- ProcessModelSection.cs
- SystemColors.cs
- ReferencedType.cs