Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- HMACSHA384.cs
- CodeGroup.cs
- ObjectDataSourceDisposingEventArgs.cs
- CompositeScriptReference.cs
- ZipIOModeEnforcingStream.cs
- XmlQueryType.cs
- ProtocolsConfigurationHandler.cs
- GlyphCache.cs
- DayRenderEvent.cs
- HwndSubclass.cs
- InheritanceAttribute.cs
- DiscoveryDocumentSearchPattern.cs
- StylusDownEventArgs.cs
- GeometryGroup.cs
- AssertFilter.cs
- FontFamilyConverter.cs
- ListViewItemMouseHoverEvent.cs
- Highlights.cs
- ContainsRowNumberChecker.cs
- DefaultPropertyAttribute.cs
- EarlyBoundInfo.cs
- EasingFunctionBase.cs
- NotifyIcon.cs
- TypeBuilderInstantiation.cs
- Buffer.cs
- PieceDirectory.cs
- Privilege.cs
- DataSourceCacheDurationConverter.cs
- ScrollBarAutomationPeer.cs
- HttpTransportSecurity.cs
- MultilineStringConverter.cs
- RootBrowserWindowAutomationPeer.cs
- RelationshipEnd.cs
- PropertyEmitter.cs
- TreeWalkHelper.cs
- DateTimeParse.cs
- LocalizabilityAttribute.cs
- HotSpotCollection.cs
- AudioSignalProblemOccurredEventArgs.cs
- CertificateElement.cs
- MatrixAnimationBase.cs
- WindowManager.cs
- ProvidersHelper.cs
- SynchronizationLockException.cs
- LineGeometry.cs
- TraceXPathNavigator.cs
- MetadataItemEmitter.cs
- AutoSizeComboBox.cs
- PropertyTabChangedEvent.cs
- TransportChannelFactory.cs
- ProfileManager.cs
- IisTraceWebEventProvider.cs
- ObjectTypeMapping.cs
- MouseButtonEventArgs.cs
- ContentOperations.cs
- PTProvider.cs
- DataGridViewAutoSizeModeEventArgs.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- PersonalizableAttribute.cs
- HandlerBase.cs
- HyperLinkDesigner.cs
- DataSourceXmlSubItemAttribute.cs
- WindowsTokenRoleProvider.cs
- PreservationFileReader.cs
- ApplicationSettingsBase.cs
- FileUpload.cs
- AVElementHelper.cs
- RangeBase.cs
- HttpWrapper.cs
- OperationAbortedException.cs
- Image.cs
- XmlNode.cs
- XmlSchemaAnnotation.cs
- RecordsAffectedEventArgs.cs
- DataGridViewTextBoxCell.cs
- TextPatternIdentifiers.cs
- ThreadSafeMessageFilterTable.cs
- GradientBrush.cs
- ResolveResponse.cs
- ValidatingPropertiesEventArgs.cs
- AutomationIdentifier.cs
- HtmlLink.cs
- WriteTimeStream.cs
- Win32KeyboardDevice.cs
- NestedContainer.cs
- SettingsSection.cs
- CompiledQuery.cs
- EpmTargetTree.cs
- ProcessHost.cs
- Helper.cs
- RightsManagementEncryptedStream.cs
- SchemaImporter.cs
- DataMemberConverter.cs
- ObjectItemCollectionAssemblyCacheEntry.cs
- TreeViewImageKeyConverter.cs
- RequestResponse.cs
- MdiWindowListItemConverter.cs
- WCFBuildProvider.cs
- SqlTransaction.cs
- AndMessageFilterTable.cs