Практически невозможно правильно написать финализатор, и выполнение такого рода работы за один раз - всего лишь рецепт катастрофы. Не говоря уже о том, что это снизит производительность и станет невозможным для отладки. Правило 1 для финализаторов - никогда не используйте их. Правило 2 (только для опытных пользователей) - не используйте их, если вы действительно не уверены в этом.
Если это просто для веселого хобби-проекта, то здесь нет никакого реального вреда, и он, вероятно, будет работать достаточно хорошо, но я бы заплакал, если бы я увидел что-то подобное в рабочей базе кода.
Если вы действительно хотите сделать что-то подобное, то я бы сделал это явным вызовом и просто использовал бы финализатор для обнаружения случаев во время отладки, когда явный метод не был вызван, например,
class MyClass
{
private bool dirty; // set this whenever the object changes
~MyClass
{
if (this.dirty)
{
Debug.Fail("Object was not saved.");
}
}
public void Save()
{
if (this.dirty)
{
// TODO: do the save
this.dirty = false;
}
}
}