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
- SessionEndingEventArgs.cs
- RuleSettingsCollection.cs
- ContentHostHelper.cs
- ThreadInterruptedException.cs
- BamlMapTable.cs
- ClientCredentials.cs
- ProjectedSlot.cs
- DataPager.cs
- Mappings.cs
- DataQuery.cs
- ProfileGroupSettingsCollection.cs
- WindowsClaimSet.cs
- HandlerFactoryWrapper.cs
- PolicyManager.cs
- LinqDataSourceUpdateEventArgs.cs
- TimelineGroup.cs
- WeakEventManager.cs
- TrustLevelCollection.cs
- SchemaDeclBase.cs
- TableLayoutSettingsTypeConverter.cs
- SafeTimerHandle.cs
- TraceRecords.cs
- Hex.cs
- ToolStripProgressBar.cs
- Helpers.cs
- PerformanceCounterCategory.cs
- TagPrefixInfo.cs
- TextUtf8RawTextWriter.cs
- MailMessage.cs
- ObjectDataProvider.cs
- DurableDispatcherAddressingFault.cs
- FirstQueryOperator.cs
- ProfileInfo.cs
- UInt16.cs
- HuffmanTree.cs
- RefreshEventArgs.cs
- Encoding.cs
- ScriptingSectionGroup.cs
- OletxEnlistment.cs
- TimeEnumHelper.cs
- WorkflowElementDialogWindow.xaml.cs
- TextTreeTextBlock.cs
- DataError.cs
- RoleService.cs
- WebPartDescriptionCollection.cs
- StrongNamePublicKeyBlob.cs
- NavigationProgressEventArgs.cs
- LinkArea.cs
- InvokeFunc.cs
- InArgumentConverter.cs
- WsatServiceAddress.cs
- ErrorHandlerModule.cs
- ToolStripKeyboardHandlingService.cs
- LinearGradientBrush.cs
- VirtualPathUtility.cs
- DefaultPropertyAttribute.cs
- WmpBitmapDecoder.cs
- AppDomainFactory.cs
- _LocalDataStoreMgr.cs
- TaiwanCalendar.cs
- RelativeSource.cs
- ByteAnimationUsingKeyFrames.cs
- GC.cs
- SoapFault.cs
- WMICapabilities.cs
- SizeAnimationUsingKeyFrames.cs
- PrefixQName.cs
- PrimitiveType.cs
- CanonicalFontFamilyReference.cs
- LinearGradientBrush.cs
- EdmFunction.cs
- basevalidator.cs
- HashAlgorithm.cs
- EllipseGeometry.cs
- Random.cs
- TransformCollection.cs
- DataSourceCollectionBase.cs
- MailWriter.cs
- XmlTextEncoder.cs
- AssemblyName.cs
- VScrollBar.cs
- XmlUrlResolver.cs
- CompilerErrorCollection.cs
- TemplateNameScope.cs
- ClientRuntimeConfig.cs
- VarInfo.cs
- cookiecontainer.cs
- CompositeFontInfo.cs
- ClientFormsAuthenticationCredentials.cs
- MenuCommand.cs
- SQLSingle.cs
- ConstraintConverter.cs
- DataBoundControlHelper.cs
- WindowsStatic.cs
- DataServiceRequestArgs.cs
- KnownIds.cs
- FormView.cs
- XamlSerializationHelper.cs
- ConsoleTraceListener.cs
- Itemizer.cs