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
- DisplayMemberTemplateSelector.cs
- UpdateTranslator.cs
- RowType.cs
- PerformanceCounterPermission.cs
- PrePrepareMethodAttribute.cs
- HttpHandlerActionCollection.cs
- ContextMarshalException.cs
- AuthenticatingEventArgs.cs
- Processor.cs
- XpsResourceDictionary.cs
- UIElement.cs
- AttachmentService.cs
- QueryOperator.cs
- AnnotationHighlightLayer.cs
- NativeWindow.cs
- StreamWithDictionary.cs
- SecurityRuntime.cs
- PersistenceException.cs
- UInt32Storage.cs
- TypedTableBase.cs
- DataServiceProviderWrapper.cs
- ButtonAutomationPeer.cs
- Operators.cs
- UIElementParagraph.cs
- SecurityStandardsManager.cs
- GridViewHeaderRowPresenterAutomationPeer.cs
- InputReportEventArgs.cs
- NavigationHelper.cs
- X509ImageLogo.cs
- SerTrace.cs
- MappingItemCollection.cs
- HtmlHead.cs
- CustomValidator.cs
- GenericWebPart.cs
- ConstraintEnumerator.cs
- HwndSourceKeyboardInputSite.cs
- SecurityKeyUsage.cs
- ToolStripDesignerAvailabilityAttribute.cs
- TreeView.cs
- EntityDataSourceEntityTypeFilterItem.cs
- Monitor.cs
- PreloadedPackages.cs
- GridProviderWrapper.cs
- ObjectIDGenerator.cs
- WindowsIPAddress.cs
- CodeDomDesignerLoader.cs
- SelectionEditor.cs
- VisualStyleInformation.cs
- TextPointerBase.cs
- PanelStyle.cs
- SqlNodeAnnotation.cs
- Attributes.cs
- TextEffect.cs
- TraceSwitch.cs
- ObjectDataSourceStatusEventArgs.cs
- BufferModeSettings.cs
- XPathScanner.cs
- TextHidden.cs
- EventProviderWriter.cs
- CodeArrayIndexerExpression.cs
- HtmlInputReset.cs
- WindowsServiceElement.cs
- basevalidator.cs
- LabelAutomationPeer.cs
- WebEventTraceProvider.cs
- ComPlusAuthorization.cs
- wmiutil.cs
- BinaryFormatterWriter.cs
- ObjectParameterCollection.cs
- ParameterSubsegment.cs
- Permission.cs
- ToolStripDropDownClosingEventArgs.cs
- ParamArrayAttribute.cs
- Message.cs
- SHA512Managed.cs
- DataBinding.cs
- Activity.cs
- HttpVersion.cs
- ContentType.cs
- ExclusiveTcpListener.cs
- UInt32.cs
- ItemChangedEventArgs.cs
- ProfileInfo.cs
- ResourceReferenceExpression.cs
- SlipBehavior.cs
- UserControlParser.cs
- EvidenceBase.cs
- HebrewNumber.cs
- PackageDocument.cs
- RepeaterItemEventArgs.cs
- CompositeDataBoundControl.cs
- ProfileServiceManager.cs
- HostUtils.cs
- EditingCoordinator.cs
- ValueChangedEventManager.cs
- RtfToken.cs
- ViewStateModeByIdAttribute.cs
- ObjectStateManager.cs
- CodeGenerator.cs
- TextFormatterHost.cs