自学.net垃圾收集如何处理这个例子

时间:2014-07-22 19:56:15

标签: c# .net garbage-collection garbage

所以我有一些关于垃圾收集的问题。

void send_email()
{
    EmailMessage message = new EmailMessage(service);
    message.Subject = "AQState";
    message.Body = Environment.MachineName + " AQState = " + get_AQState();
    message.ToRecipients.Add("email@email.com");

    message.Send();
}

如果我有一个程序每小时调用一次send_email(),那么GC将如何处理在第1小时创建的对象,然后是小时2然后是小时3.所以每小时它会创建一个新的消息对象,GC将摆脱旧的什么或什么?什么被认为是更好的做法?您在上方或下方看到的内容

namespace AQState_Test
{
    class Program
    {
        EmailMessage message = new EmailMessage(service);

        static void Main(string[] args)
        {
            send_email();
        }

    void send_email()
    {
        message.Subject = "AQState";
        message.Body = Environment.MachineName + " AQState = " + get_AQState();
        message.ToRecipients.Add("email@email.com");

        message.Send();
    }

我自学编程,我非常喜欢它,但如果有人可以推荐一本书来教我基础知识并给我一个更好的基础,那么我会发现自己错过了一些基础知识。

1 个答案:

答案 0 :(得分:1)

new关键字将始终生成所需类的新实例。一旦实例无法访问,即在第一个示例中的send_email()方法结束时,实例将被标记为有资格进行垃圾回收。因此,一旦没有可能影响它的代码,就无法重复使用。

在第二个示例中,由于message实例有效地属于整个Program类,因此在Program类不在之前,它将不会被标记为有资格进行垃圾回收范围,如果命名约定如其所示,则意味着它根本不会被垃圾收集,并且只有在程序退出时才会回收内存。

哪个更好取决于Program类的其他成员是否需要访问该消息。理想情况下,您不希望将message实例公开给Program类不需要了解它的其他部分,所以除了{{1方法需要访问send_email()实例,然后保留第一个版本。