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
- WebPartConnectionsConnectVerb.cs
- XmlNotation.cs
- Context.cs
- ResourceBinder.cs
- ThreadNeutralSemaphore.cs
- XmlValueConverter.cs
- BinaryParser.cs
- XamlLoadErrorInfo.cs
- DataServiceRequestOfT.cs
- HtmlUtf8RawTextWriter.cs
- DetailsViewModeEventArgs.cs
- WebPartEditVerb.cs
- peersecuritysettings.cs
- BasicViewGenerator.cs
- Char.cs
- DoubleLinkListEnumerator.cs
- EdmValidator.cs
- KeysConverter.cs
- SystemKeyConverter.cs
- ItemCollection.cs
- EntityConnection.cs
- JavascriptCallbackBehaviorAttribute.cs
- CodeTypeMember.cs
- MouseBinding.cs
- ConstraintStruct.cs
- FormViewInsertedEventArgs.cs
- UnsafeNativeMethodsPenimc.cs
- DoubleUtil.cs
- DataServiceProviderWrapper.cs
- DSASignatureFormatter.cs
- LineUtil.cs
- SaveWorkflowAsyncResult.cs
- PrivilegeNotHeldException.cs
- BreadCrumbTextConverter.cs
- PropertyToken.cs
- CachedPathData.cs
- FieldTemplateUserControl.cs
- XmlnsDefinitionAttribute.cs
- KeyGestureValueSerializer.cs
- XmlValidatingReaderImpl.cs
- CollectionBase.cs
- DataServiceException.cs
- ScriptComponentDescriptor.cs
- TableLayoutPanelCellPosition.cs
- TextDecorationCollection.cs
- IItemContainerGenerator.cs
- GetChildSubtree.cs
- CompatibleComparer.cs
- ErrorInfoXmlDocument.cs
- SqlMethodTransformer.cs
- APCustomTypeDescriptor.cs
- COMException.cs
- DataColumnMappingCollection.cs
- TrailingSpaceComparer.cs
- Regex.cs
- StringValueConverter.cs
- BookmarkWorkItem.cs
- SystemInfo.cs
- HexParser.cs
- DesignerCategoryAttribute.cs
- EntityConnectionStringBuilder.cs
- RegexStringValidator.cs
- BinaryWriter.cs
- HtmlDocument.cs
- ClientRuntimeConfig.cs
- RootAction.cs
- UTF8Encoding.cs
- SafeNativeMethods.cs
- DataGridColumn.cs
- DesignerCategoryAttribute.cs
- RtfNavigator.cs
- ProfileSection.cs
- SerializerWriterEventHandlers.cs
- SecurityTokenSerializer.cs
- CryptoHandle.cs
- WsiProfilesElementCollection.cs
- WindowsNonControl.cs
- InstanceData.cs
- TypeInitializationException.cs
- DataGridViewColumnDesignTimeVisibleAttribute.cs
- OpenFileDialog.cs
- TypeCodeDomSerializer.cs
- SmtpDigestAuthenticationModule.cs
- ByeMessageCD1.cs
- OperatingSystem.cs
- TypeExtension.cs
- SingleSelectRootGridEntry.cs
- BindToObject.cs
- NamedElement.cs
- Grant.cs
- ComponentEvent.cs
- ImportContext.cs
- CipherData.cs
- DependencyPropertyDescriptor.cs
- TraceUtils.cs
- XmlComment.cs
- TraceFilter.cs
- OLEDB_Util.cs
- Subtree.cs
- XmlDataContract.cs