#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
метод будет вызван тестировщиком, что, я думаю, вы бы предпочли.