Использование финализатора для выполнения очистки — Xunit

#c# #.net #destructor #xunit

#c# #.net #деструктор #xunit

Вопрос:

Я использовал финализатор для выполнения операций очистки в xUnit.

     public class CSATWebClientTests
    {
        private readonly        CSATWebServer server;
        private readonly        CSATClient    client;
        private static readonly Random        Rng            = new Random((int)DateTime.Now.Ticks);
        private readonly        string        instancePrefix = $"http://localhost:{Rng.Next(20000, 30000)}/";

        public CSATWebClientTests()
        {
            server = new CSATWebServer(new[] {instancePrefix});
            client = new CSATClient(instancePrefix);
            server.Start();
        }

        ~CSATWebClientTests()
        {
            server.Stop();
        }
}
  

Кажется, это работает, но я быстро просмотрел документы, и в них говорится, что вместо этого я должен внедрять IDispose .

Есть ли какая-либо причина, по которой это было бы лучше?

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

1. Имейте в виду, что существует разница между деструктором и финализатором. В вашем коде есть финализатор. Пожалуйста, обновите вопрос, другим будет легче помочь.

2.Использование финализатора чревато проблемами в лучшие дни и обычно указывает на что-то неправильное. финализаторы могут никогда не вызываться, возникают проблемы с безопасностью потоков, <вставьте множество других причин здесь>. Однако, в целом, если в документах указано использовать IDisposable интерфейс, я бы следовал документации

3. @MichaelRandall Я намереваюсь это сделать, хотя больше задавался вопросом «почему». Даже если это в основном академический

4. Финализаторы вызываются, когда сборщик мусора собирает экземпляр. The programmer has no control over when the finalizer is called; the garbage collector decides when to call it. Это означает, что он может никогда не быть вызван.

5. Система вызовет финализатор, где Dispose метод будет вызван тестировщиком, что, я думаю, вы бы предпочли.