所以我有一些关于垃圾收集的问题。
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();
}
我自学编程,我非常喜欢它,但如果有人可以推荐一本书来教我基础知识并给我一个更好的基础,那么我会发现自己错过了一些基础知识。
答案 0 :(得分:1)
new
关键字将始终生成所需类的新实例。一旦实例无法访问,即在第一个示例中的send_email()
方法结束时,实例将被标记为有资格进行垃圾回收。因此,一旦没有可能影响它的代码,就无法重复使用。
在第二个示例中,由于message
实例有效地属于整个Program
类,因此在Program
类不在之前,它将不会被标记为有资格进行垃圾回收范围,如果命名约定如其所示,则意味着它根本不会被垃圾收集,并且只有在程序退出时才会回收内存。
哪个更好取决于Program
类的其他成员是否需要访问该消息。理想情况下,您不希望将message
实例公开给Program
类不需要了解它的其他部分,所以除了{{1方法需要访问send_email()
实例,然后保留第一个版本。