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
- BrushProxy.cs
- SortableBindingList.cs
- TextDecoration.cs
- DoubleIndependentAnimationStorage.cs
- NavigationProgressEventArgs.cs
- DuplicateWaitObjectException.cs
- DataGridViewCellStateChangedEventArgs.cs
- HtmlElement.cs
- XPathNodeHelper.cs
- Freezable.cs
- AttributeUsageAttribute.cs
- Int32.cs
- smtppermission.cs
- DrawingVisualDrawingContext.cs
- UnsafeNativeMethods.cs
- ImportContext.cs
- AdditionalEntityFunctions.cs
- HttpWriter.cs
- DataFormat.cs
- SBCSCodePageEncoding.cs
- TextRange.cs
- Tuple.cs
- InplaceBitmapMetadataWriter.cs
- NumericExpr.cs
- CorePropertiesFilter.cs
- ThreadAbortException.cs
- AssociationEndMember.cs
- CustomSignedXml.cs
- BindingCompleteEventArgs.cs
- WSFederationHttpSecurity.cs
- RuleConditionDialog.cs
- EditorPartCollection.cs
- Errors.cs
- WindowsToolbarItemAsMenuItem.cs
- ThicknessKeyFrameCollection.cs
- HtmlTableRowCollection.cs
- DefaultBinder.cs
- SettingsAttributeDictionary.cs
- TypeContext.cs
- TextRunProperties.cs
- ConnectionsZone.cs
- ProjectionCamera.cs
- FutureFactory.cs
- FieldAccessException.cs
- XmlILOptimizerVisitor.cs
- EventManager.cs
- FormView.cs
- Point3DCollection.cs
- _DisconnectOverlappedAsyncResult.cs
- SynchronizedDisposablePool.cs
- DesignerView.cs
- ConfigXmlComment.cs
- ChildrenQuery.cs
- IntegerFacetDescriptionElement.cs
- ScrollBarRenderer.cs
- DataGridViewColumnConverter.cs
- ellipse.cs
- WindowsStartMenu.cs
- HtmlValidatorAdapter.cs
- EventTrigger.cs
- CfgParser.cs
- TraceSection.cs
- ReachSerializationCacheItems.cs
- Font.cs
- CounterCreationData.cs
- DefaultEvaluationContext.cs
- X509SecurityToken.cs
- HttpCapabilitiesBase.cs
- AspNetRouteServiceHttpHandler.cs
- Utils.cs
- ExceptionWrapper.cs
- XmlTextReaderImplHelpers.cs
- Debug.cs
- FontFamily.cs
- ScriptBehaviorDescriptor.cs
- GC.cs
- AccessDataSourceView.cs
- NetworkInformationPermission.cs
- TimeZoneInfo.cs
- SQLGuid.cs
- ChangePasswordDesigner.cs
- COM2ExtendedTypeConverter.cs
- CultureInfoConverter.cs
- RelationshipEnd.cs
- precedingsibling.cs
- FormViewPagerRow.cs
- InvalidBodyAccessException.cs
- PageRequestManager.cs
- ColumnMapVisitor.cs
- PipelineComponent.cs
- DependencyPropertyChangedEventArgs.cs
- TitleStyle.cs
- MaxMessageSizeStream.cs
- NullNotAllowedCollection.cs
- SocketPermission.cs
- _ProxyChain.cs
- X509RawDataKeyIdentifierClause.cs
- AdornerHitTestResult.cs
- FunctionDetailsReader.cs
- MetadataItemEmitter.cs