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
- StrongTypingException.cs
- ConfigurationLocation.cs
- DataProtection.cs
- CustomBindingElementCollection.cs
- PagesSection.cs
- ZipIOLocalFileHeader.cs
- CodeMemberField.cs
- UriSection.cs
- PlaceHolder.cs
- SecurityElement.cs
- DocumentScope.cs
- SizeFConverter.cs
- IApplicationTrustManager.cs
- SqlProviderManifest.cs
- BackgroundWorker.cs
- ExpressionBindingCollection.cs
- DataGridViewTopLeftHeaderCell.cs
- SmtpMail.cs
- DropDownList.cs
- FixedSOMImage.cs
- VisualCollection.cs
- ControlEvent.cs
- TailCallAnalyzer.cs
- MetadataArtifactLoaderCompositeResource.cs
- Deserializer.cs
- SelectionService.cs
- ProfileService.cs
- UIElement.cs
- ObsoleteAttribute.cs
- SchemaImporter.cs
- DataReceivedEventArgs.cs
- MimeObjectFactory.cs
- basevalidator.cs
- FontCollection.cs
- SqlFormatter.cs
- DesignerSerializerAttribute.cs
- ComAwareEventInfo.cs
- PolygonHotSpot.cs
- WriteableOnDemandStream.cs
- OletxCommittableTransaction.cs
- LinearKeyFrames.cs
- MarkedHighlightComponent.cs
- DesignerResources.cs
- ByteArrayHelperWithString.cs
- DefaultAuthorizationContext.cs
- ZipIOZip64EndOfCentralDirectoryLocatorBlock.cs
- HttpListener.cs
- SkewTransform.cs
- ImportCatalogPart.cs
- QueryResponse.cs
- Subset.cs
- PropertyItem.cs
- OracleLob.cs
- TextCompositionEventArgs.cs
- MessageSecurityOverTcp.cs
- DoWorkEventArgs.cs
- RepeatEnumerable.cs
- PersistenceTypeAttribute.cs
- XmlILOptimizerVisitor.cs
- ConfigurationStrings.cs
- ListViewCancelEventArgs.cs
- TimelineGroup.cs
- DeadCharTextComposition.cs
- OneWayBindingElement.cs
- DataPagerFieldCollection.cs
- Int32KeyFrameCollection.cs
- ObjectDataSourceEventArgs.cs
- Rect3D.cs
- MouseButtonEventArgs.cs
- Control.cs
- MultiDataTrigger.cs
- DescriptionAttribute.cs
- DataGridViewCellConverter.cs
- ObjectSecurity.cs
- MenuItemStyle.cs
- IOException.cs
- NotifyParentPropertyAttribute.cs
- GenerateHelper.cs
- ExpressionBindings.cs
- QueryStringParameter.cs
- WebEventCodes.cs
- SafeLibraryHandle.cs
- AxWrapperGen.cs
- Rotation3DAnimationUsingKeyFrames.cs
- AttachedAnnotation.cs
- FormatConvertedBitmap.cs
- SectionRecord.cs
- SlipBehavior.cs
- CompositionAdorner.cs
- JoinSymbol.cs
- InvalidCastException.cs
- HttpListenerRequestUriBuilder.cs
- QilTargetType.cs
- InputScopeNameConverter.cs
- SingleAnimation.cs
- Scene3D.cs
- XsdCachingReader.cs
- ModelItemDictionaryImpl.cs
- DescendantQuery.cs
- TemplateColumn.cs