Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
Tradução
Original
Este tópico ainda não foi avaliado como - Avalie este tópico

WeakReference Classe

Representa uma referência fraca, que referencia um Objeto permitindo ainda que Objeto para ser recuperados por coleta de lixo.

Namespace:  System
Assembly:  mscorlib (em mscorlib. dll)
[SerializableAttribute]
[ComVisibleAttribute(true)]
[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public class WeakReference : ISerializable

Uma referência fraca permite que o coletor de lixo coletar um objeto enquanto ainda permite que um aplicativo para acessar o objeto.Se você precisar o objeto, você ainda pode obter uma referência de alta segurança para ele e impedir que ele coletadas.For more information about how to use short and long weak references, see Usando referências fraca.

The following code example creates an instance of a class, ClassA, to track with a weak reference.Instead of waiting for garbage collection to occur, a Timer is used to instigate garbage collection or to change the weak reference back to a strong reference to the object.Change the WeakReference constructor from false to true to examine the output resulting from short and long weak references.

using System;
using System.Timers;

class Program
{

    static void Main(string[] args)
    {

        // Creating an instance
        // of an object creates
        // a strong reference.
        ClassA objA1 = new ClassA();

        // Create a short weak reference to the object.
        // Specify true for a long weak reference.
        WeakReference wr = new WeakReference(objA1, false);

        // Set the target of the
        // weak reference to the object.
        wr.Target = objA1;

        // Remove the strong reference
        // the application has to the object.
        objA1 = null;
        if (objA1 == null)
        {
            Console.WriteLine("After setting objA1 to null: objA1 is null.");
        }

        // Set a timer to set a strong reference
        // and to force garbage collection.
        System.Timers.Timer aTimer = new System.Timers.Timer();

        // Set interval to 5 seconds.
        aTimer.Interval = 5000;
        aTimer.Enabled = true;

        // Counter for tracking.
        int count = 1;

        // Anonymous method.
        aTimer.Elapsed += delegate(object sender,
            System.Timers.ElapsedEventArgs e)
        {
            if (objA1 == null)
            {
                Console.WriteLine("objA1 is null");

                // Adjust the count higher if
                // you want to allow more time
                // for automatic garbage collection.
                if (count == 5)
                {
                    // Uncomment next line to set a strong reference.
                    //objA1 = (ClassA)wr.Target;
                    GC.Collect();
                }

                if (count == 8)
                {
                    // This code is only reached if
                    // the weak reference is long.
                    objA1 = (ClassA)wr.Target;

                }
                if (wr.IsAlive == false)
                {
                    // Object is collected and
                    // all references terminated.
                    Console.WriteLine("Object collected");
                    aTimer.Stop();
                }
                else
                {
                    Console.WriteLine("count {0}, still alive. long weak reference: {1}",
                        count.ToString(),
                        wr.TrackResurrection.ToString());
                    count++;
                }
            }
            else
            {
                // A strong reference is established
                // and prevents it being collected.
                Console.WriteLine("Strong reference applied");
                aTimer.Stop();
            }
        };
    }

}
public class ClassA
{
    public ClassA()
    {

    }

    ~ClassA()
    {
        Console.WriteLine("Finalized.");
    }

    void MakeSomeGarbage()
    {
        // Create objects and release them
        // to fill up memory with unused objects.
        Version vt;

        for (int i = 0; i < 10000; i++)
        {
            vt = new Version();
        }
    }
}


// -------- Code example output --------
//
// A short weak reference creates
// the following output:
// ------------------------------------
// After setting objA1 to null: objA1 is null.
// objA1 is null
// count 1, still alive. long weak reference: False
// objA1 is null
// count 2, still alive. long weak reference: False
// objA1 is null
// count 3, still alive. long weak reference: False
// objA1 is null
// count 4, still alive. long weak reference: False
// objA1 is null
// Object collected
// Finalized.
// ------------------------------------
//
//
// A long weak reference creates
// the following output, being
// ressurected at count 5.
// ------------------------------------
// After setting objA1 to null: objA1 is null.
// objA1 is null
// count 1, still alive. long weak reference: True
// objA1 is null
// count 2, still alive. long weak reference: True
// objA1 is null
// count 3, still alive. long weak reference: True
// objA1 is null
// count 4, still alive. long weak reference: True
// objA1 is null
// count 5, still alive. long weak reference: True
// Finalized.
// objA1 is null
// count 6, still alive. long weak reference: True
// objA1 is null
// count 7, still alive. long weak reference: True
// objA1 is null
// count 8, still alive. long weak reference: True
// Strong reference applied
// ----------------------------------
//
//
// A weak reference creates
// the following output with a
// strong reference applied
// at count 5.
// ----------------------------------
// After setting objA1 to null: objA1 is null.
// objA1 is null
// count 1, still alive. long weak reference: False
// objA1 is null
// count 2, still alive. long weak reference: False
// objA1 is null
// count 3, still alive. long weak reference: False
// objA1 is null
// count 4, still alive. long weak reference: False
// objA1 is null
// count 5, still alive. long weak reference: False
// Strong reference applied
// ------------------------------------
//


System.Object
  System.WeakReference
Quaisquer membros públicos estático (compartilhados na Visual Basic) desse tipo são Thread seguro. Não há garantia de que qualquer membro de instância seja isento de segmentos.
Isso foi útil para você?
(1500 caracteres restantes)

Contribuições da comunidade

ADICIONAR
© 2013 Microsoft. Todos os direitos reservados.