C # создать объект Filewatcher в цикле

#c# #oop

#c# #ооп

Вопрос:

Я создаю Filewatcher в цикле ниже. Я хотел бы знать, есть ли какие-либо проблемы с производительностью или ссылками, поскольку моя ссылочная переменная одинакова в цикле?

 foreach (var dir in dirsToWatch)
{
    **var watcher = new FileSystemWatcher(dir);**
    watcher.Filter = filter;
    watcher.Changed  = new FileSystemEventHandler(onChange);
    watcher.Created  = new FileSystemEventHandler(onChange);
}
  

Комментарии:

1. Нет? Основываясь на том, что у вас есть, вы вынуждены делать это так, как вы это делаете. Вы не можете создать watcher переменную без ссылки на dir . Каждая итерация цикла создаст свою собственную watcher переменную, но вы не можете использовать watcher ее вне цикла. Вы думаете об удалении объекта?

2. спасибо, да, я тоже думаю об утилизации.

Ответ №1:

Не совсем ясно, какова конечная цель вашего кода, но если вы хотите использовать watcher объекты после завершения цикла, вам нужно сохранить их экземпляры в коллекции вне цикла. В противном случае у вас не будет ссылки на них, и они будут просто собраны в мусор.

Например:

 var watchers = new List<FileSystemWatcher>();

foreach (var dir in dirsToWatch)
{
    var watcher = new FileSystemWatcher(dir) {Filter = filter};
    watcher.Changed  = new FileSystemEventHandler(onChange);
    watcher.Created  = new FileSystemEventHandler(onChange);
    watchers.Add(watcher);
}

// Do something with watchers here

// Dispose of watchers when done
watchers.ForEach(watcher => watcher.Dispose());