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
- AsymmetricSignatureDeformatter.cs
- SqlMethodCallConverter.cs
- LoadWorkflowCommand.cs
- HwndAppCommandInputProvider.cs
- MenuItem.cs
- IIS7UserPrincipal.cs
- SerTrace.cs
- FileDataSourceCache.cs
- XsltException.cs
- InstancePersistence.cs
- GifBitmapDecoder.cs
- RegexCode.cs
- InkCanvasAutomationPeer.cs
- PrivilegeNotHeldException.cs
- ThicknessAnimation.cs
- Speller.cs
- ApplicationContext.cs
- PenContext.cs
- SortKey.cs
- SqlTypeConverter.cs
- RemoteWebConfigurationHostServer.cs
- QueryPrefixOp.cs
- Point4DConverter.cs
- TraceContextEventArgs.cs
- GiveFeedbackEvent.cs
- MapPathBasedVirtualPathProvider.cs
- NoPersistProperty.cs
- CellParagraph.cs
- MobileControlPersister.cs
- _Events.cs
- ErrorFormatterPage.cs
- KeyPressEvent.cs
- Int32RectValueSerializer.cs
- TerminatorSinks.cs
- XmlDictionary.cs
- ServiceHttpHandlerFactory.cs
- DateTimeConverter.cs
- PackageDigitalSignature.cs
- FormViewPageEventArgs.cs
- Matrix.cs
- ClosureBinding.cs
- SqlWriter.cs
- ProcessInputEventArgs.cs
- shaperfactoryquerycacheentry.cs
- FormsAuthenticationTicket.cs
- controlskin.cs
- documentsequencetextpointer.cs
- SiteMapNode.cs
- TextTreeExtractElementUndoUnit.cs
- PersonalizationDictionary.cs
- Site.cs
- BuildManagerHost.cs
- EdmRelationshipNavigationPropertyAttribute.cs
- StateManagedCollection.cs
- PTUtility.cs
- ErrorRuntimeConfig.cs
- XmlCDATASection.cs
- Separator.cs
- TailPinnedEventArgs.cs
- XsltOutput.cs
- StylusButtonEventArgs.cs
- PointConverter.cs
- ObjectNotFoundException.cs
- ServiceDocumentFormatter.cs
- KeySplineConverter.cs
- FormViewPagerRow.cs
- Int64Converter.cs
- SectionVisual.cs
- AppearanceEditorPart.cs
- PackageFilter.cs
- SchemaNamespaceManager.cs
- AutomationIdentifier.cs
- RtfControls.cs
- FormsAuthenticationModule.cs
- DataReaderContainer.cs
- Types.cs
- FragmentNavigationEventArgs.cs
- ServiceOperationParameter.cs
- UpdateCompiler.cs
- PathBox.cs
- SerialPinChanges.cs
- ZipIOLocalFileBlock.cs
- InternalControlCollection.cs
- BitmapSourceSafeMILHandle.cs
- TypeDependencyAttribute.cs
- PinProtectionHelper.cs
- ImpersonationContext.cs
- ExpressionReplacer.cs
- AssemblyAttributes.cs
- util.cs
- LogEntryHeaderv1Deserializer.cs
- Executor.cs
- BinaryFormatterWriter.cs
- ContextMenuAutomationPeer.cs
- MarkerProperties.cs
- BaseResourcesBuildProvider.cs
- Inline.cs
- FontStyle.cs
- DocumentPageViewAutomationPeer.cs
- StyleSheetComponentEditor.cs