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
- ModelVisual3D.cs
- MaskInputRejectedEventArgs.cs
- TableItemStyle.cs
- IFlowDocumentViewer.cs
- ListParaClient.cs
- ObjectDataSourceView.cs
- MemberHolder.cs
- XmlReturnReader.cs
- DynamicPropertyReader.cs
- ObjectContextServiceProvider.cs
- HttpSessionStateWrapper.cs
- DataContract.cs
- Mapping.cs
- DataBinder.cs
- ProfilePropertySettings.cs
- AsymmetricSignatureFormatter.cs
- AdvancedBindingEditor.cs
- RijndaelManaged.cs
- SelectedDatesCollection.cs
- RankException.cs
- Win32SafeHandles.cs
- ListBox.cs
- SecurityToken.cs
- ProtectedProviderSettings.cs
- Grant.cs
- MulticastDelegate.cs
- TaskSchedulerException.cs
- TriggerCollection.cs
- UriWriter.cs
- remotingproxy.cs
- IdentityModelDictionary.cs
- X509ClientCertificateCredentialsElement.cs
- BindingWorker.cs
- QueryContinueDragEvent.cs
- DelegatedStream.cs
- FromRequest.cs
- CacheAxisQuery.cs
- IconConverter.cs
- FormatControl.cs
- DirectoryGroupQuery.cs
- DrawListViewItemEventArgs.cs
- Menu.cs
- ChangeDirector.cs
- Page.cs
- SerializationInfo.cs
- RelationshipFixer.cs
- ComplexPropertyEntry.cs
- BinaryHeap.cs
- WebEventTraceProvider.cs
- HttpModulesSection.cs
- HttpServerVarsCollection.cs
- DebugView.cs
- Blend.cs
- ColorBlend.cs
- PrimitiveCodeDomSerializer.cs
- Comparer.cs
- UserPersonalizationStateInfo.cs
- MoveSizeWinEventHandler.cs
- BadImageFormatException.cs
- KeyInstance.cs
- UInt16Converter.cs
- UniqueIdentifierService.cs
- Parsers.cs
- MailMessageEventArgs.cs
- SmtpFailedRecipientsException.cs
- DataGridViewCellContextMenuStripNeededEventArgs.cs
- TextTreeTextElementNode.cs
- PropertyTabAttribute.cs
- DataSourceSerializationException.cs
- StringReader.cs
- Journal.cs
- PeerTransportListenAddressValidatorAttribute.cs
- ToolStripItem.cs
- ListViewSortEventArgs.cs
- _RequestLifetimeSetter.cs
- EventItfInfo.cs
- BitmapData.cs
- DPTypeDescriptorContext.cs
- PartEditor.cs
- _UriTypeConverter.cs
- PermissionSetTriple.cs
- NamespaceList.cs
- ASCIIEncoding.cs
- DescendantQuery.cs
- WebServiceMethodData.cs
- HtmlLiteralTextAdapter.cs
- DataSourceControl.cs
- InputDevice.cs
- WindowsScrollBar.cs
- CollectionChangeEventArgs.cs
- InheritanceContextChangedEventManager.cs
- WebPartTransformerAttribute.cs
- HierarchicalDataTemplate.cs
- DesignerSerializationManager.cs
- BasicKeyConstraint.cs
- ListBoxItemWrapperAutomationPeer.cs
- SQLInt64.cs
- XmlAtomErrorReader.cs
- ContainerFilterService.cs
- DoubleLinkListEnumerator.cs