There is a good description of this generic WeakReference<> class here.
Here is an example of using WeakReferences for caching XslCompiledTransform's:
Here is an example of using WeakReferences for caching XslCompiledTransform's:
private static Dictionary<string, WeakReference<XslCompiledTransform>> xsltLookupTable = new Dictionary<string, WeakReference<XslCompiledTransform>>(); public XslCompiledTransform GetCompiledTransform(string xslFileName) { XslCompiledTransform xct = null; bool found = xsltLookupTable.ContainsKey(xslFileName); if (found) // IF the transform is already cached { // Try and get it WeakReference<XslCompiledTransform> xctWr = xsltLookupTable[xslFileName] as WeakReference<XslCompiledTransform>; xctWr.TryGetTarget(out xct); // Try and get it from the WeakReference m_logger.WriteTrace("Found XslCompiledTransform entry for \'" + xslFileName + "\' in the cache"); // Note the entry maybe null (if the weak reference expired) } if (xct == null) // IF the compiled transform was not already cached { // Create it xct = new XslCompiledTransform(); xct.Load(xslFileName, new XsltSettings { EnableDocumentFunction = true }, new XmlUrlResolver()); // Insert it into a WeakReference WeakReference<XslCompiledTransform> wr = new WeakReference<XslCompiledTransform>(xct); if (found) { m_logger.WriteTrace("Removing XslCompiledTransform entry for \'" + xslFileName + "\' as it was null in the cache"); xsltLookupTable.Remove(xslFileName); } xsltLookupTable.Add(xslFileName, wr); // Add the WeakReference to the cache m_logger.WriteTrace("Adding XslCompiledTransform entry for \'" + xslFileName + "\'"); } return xct; }It uses the new generic WeakReference<> class (available in .NET 4.5?). This class could be further refactored into a generic caching class if it was required.