[Этюд] Сломанный деструктор
Рассмотрим следующий класс:
class Goodbye
{
public Goodbye()
{
Console.WriteLine("hello" );
}
~Goodbye()
{
Console.WriteLine("goodbye" );
}
}
Тогда в обычных обстоятельствах код
static void Main()
{
new Goodbye();
GC.Collect();
GC.WaitForPendingFinalizers();
}
выведет на консоль
hello
goodbye
Однако если вместо
class Goodbye
написать
class Goodbye : DontSayGoodbye
то выведено будет только
hello
Как устроен DontSayGoodbye?
Ограничение : DontSayGoodbye не должен иметь конструктора по умолчанию.
Re: [Этюд] Сломанный деструктор
От:
relusion
Дата: 20.09.10 20:08
Оценка:
это с конструктором.
public class DontSayGoodbye
{
public DontSayGoodbye()
{
GC.SuppressFinalize(this );
}
}
Думаю как сделать без него
Re: [Этюд] Сломанный деструктор
Здравствуйте, Mab, Вы писали:
Mab>Ограничение : DontSayGoodbye не должен иметь конструктора по умолчанию.
Т.е. код класса Goodbye надо будет изменить чтобы он вызывал конструктор класса DontSayGoodbye с параметром?
Re: [Этюд] Сломанный деструктор
От:
k.o.
Дата: 20.09.10 21:53
Оценка:
Здравствуйте, Mab, Вы писали:
Mab>Рассмотрим следующий класс:
Mab>Как устроен DontSayGoodbye?
Очевидный ответ:
class Base
{
public Base()
{
GC.SuppressFinalize(this );
}
}
class DontSayGoodbye : Base
{
}
Mab>Ограничение : DontSayGoodbye не должен иметь конструктора по умолчанию.
Ограничение, вроде, не нарушил, но ты, наверно, другое решение имел в виду.
Re[2]: [Этюд] Сломанный деструктор
Здравствуйте, k.o., Вы писали:
KO>Ограничение, вроде, не нарушил, но ты, наверно, другое решение имел в виду.
Я сначала написал такой ответ, потом отправил пост в корзину. Все-таки класс DontSayGoodbye имеет конструктор по-умолчанию, что легко можно увидеть в рефлекторе.
Re[3]: [Этюд] Сломанный деструктор
Здравствуйте, MozgC, Вы писали:
Да, делегирующий конструктор, создаваемый компилятором, тоже не допустим. Именно поэтому и написано "имеет", а не "определяет".
Re[2]: [Этюд] Сломанный деструктор
Здравствуйте, MozgC, Вы писали:
MC>Т.е. код класса Goodbye надо будет изменить чтобы он вызывал конструктор класса DontSayGoodbye с параметром?
Нет, Goodbye менять нельзя.
Более того, в моем решении ни один из методов, определенных в DontSayGoodbye (явно или неявно), не выполняется.
Re[3]: [Этюд] Сломанный деструктор
class Goodbye : DontSayGoodbye
{
public Goodbye()
{
Console.WriteLine("hello" );
}
~Goodbye()
{
Console.WriteLine("goodbye" );
}
}
class DontSayGoodbye
{
public DontSayGoodbye(params object [] objs)
{
GC.SuppressFinalize(this );
}
}
Re[4]: [Этюд] Сломанный деструктор
Здравствуйте, Tepp, Вы писали:
Убедительно, но это совсем не то, чего хотелось бы
Уточню : DontSayGoodbye не должен иметь никаких конструкторов (включая делегирующий, создаваемый компилятором).
Re: [Этюд] Сломанный деструктор
Здравствуйте, Mab, Вы писали:
Mab>Как устроен DontSayGoodbye?
Подозреваю, что опять мимо, но тем не менее:
class DontSayGoodbye
{
protected class Console
{
static int writeCalls = 0;
public static void WriteLine(string s)
{
if (writeCalls > 0)
{
return ;
}
System.Console.WriteLine(s);
++writeCalls;
}
}
}
Mab>Ограничение : DontSayGoodbye не должен иметь конструктора по умолчанию.
Re[2]: [Этюд] Сломанный деструктор
Здравствуйте, k.o., Вы писали:
Класс Console, конечно, стандартный.
Re: [Этюд] Сломанный деструктор
От:
shakm
Дата: 21.09.10 06:29
Оценка:
скорее всего имеется ввиду какой-то класс, от которго наследован DontSayGoodbye, у которого что-то там сломано :-D
Re: [Этюд] Сломанный деструктор
>> ...
>> Как устроен DontSayGoodbye?
abstract class DontSayGoodbye
{
protected abstract void Finalize();
}
Re[2]: [Этюд] Сломанный деструктор
Здравствуйте, Aznog, Вы писали:
Да, именно так!
Re[3]: [Этюд] Сломанный деструктор
От:
Tepp
Дата: 21.09.10 07:26
Оценка:
А как же :"Уточню: DontSayGoodbye не должен иметь никаких конструкторов (включая делегирующий, создаваемый компилятором)." ? =)
Re[4]: [Этюд] Сломанный деструктор
Здравствуйте, Tepp, Вы писали:
Согласен, от делегирующего конструктора не избавиться. Можно потребовать, чтобы DontSayGoodbye наследовался напрямую от object и не определял явно конструктор(ов).
Re: [Этюд] Сломанный деструктор
Здравствуйте, Mab, Вы писали:
Mab>Как устроен DontSayGoodbye?
И мои пять копеек:
[DontSayGoodbye]
class DontSayGoodbye : ContextBoundObject
{
internal sealed class DontSayGoodbyeAttribute : ProxyAttribute
{
private static object value ;
public override MarshalByRefObject CreateInstance(Type type ) {
var instance = value ?? (value = base .CreateInstance(type ));
return (MarshalByRefObject)instance;
}
}
}
Help will always be given at Hogwarts to those who ask for it.
Re: [Этюд] Сломанный деструктор
Здравствуйте, Mab, Вы писали:
А вот так:
class DontSayGoodbye
{
~DontSayGoodbye()
{
Console.Clear();
Console.WriteLine("hello" );
}
}
?
Re[2]: [Этюд] Сломанный деструктор
От:
shakm
Дата: 21.09.10 08:56
Оценка:
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Mab, Вы писали:
S>А вот так:
S>S> class DontSayGoodbye
S> {
S> ~DontSayGoodbye()
S> {
S> Console.Clear();
S> Console.WriteLine("hello" );
S> }
S> }
S>
S>?
ржачка
Re[2]: [Этюд] Сломанный деструктор
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Mab, Вы писали:
Mab>>Как устроен DontSayGoodbye?
_FR>И мои пять копеек:
Всё равно при выгрузке домена отрабатывает
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить