[Этюд] Сломанный деструктор
От: Mab Россия http://shade.msu.ru/~mab
Дата: 20.09.10 19:56
Оценка: 66 (4)
Рассмотрим следующий класс:
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: [Этюд] Сломанный деструктор
От: MozgC США http://nightcoder.livejournal.com
Дата: 20.09.10 21:13
Оценка:
Здравствуйте, 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]: [Этюд] Сломанный деструктор
От: MozgC США http://nightcoder.livejournal.com
Дата: 20.09.10 22:01
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Ограничение, вроде, не нарушил, но ты, наверно, другое решение имел в виду.


Я сначала написал такой ответ, потом отправил пост в корзину. Все-таки класс DontSayGoodbye имеет конструктор по-умолчанию, что легко можно увидеть в рефлекторе.
Re[3]: [Этюд] Сломанный деструктор
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.10 04:08
Оценка:
Здравствуйте, MozgC, Вы писали:

Да, делегирующий конструктор, создаваемый компилятором, тоже не допустим. Именно поэтому и написано "имеет", а не "определяет".
Re[2]: [Этюд] Сломанный деструктор
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.10 04:10
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Т.е. код класса Goodbye надо будет изменить чтобы он вызывал конструктор класса DontSayGoodbye с параметром?

Нет, Goodbye менять нельзя.
Более того, в моем решении ни один из методов, определенных в DontSayGoodbye (явно или неявно), не выполняется.
Re[3]: [Этюд] Сломанный деструктор
От: Tepp  
Дата: 21.09.10 04:58
Оценка: 14 (2)
class Goodbye : DontSayGoodbye
{
    public Goodbye()
    {
        Console.WriteLine("hello");
    }
    ~Goodbye()
    {
        Console.WriteLine("goodbye");
    }
}

class DontSayGoodbye 
{
    public DontSayGoodbye(params object[] objs)
    {
        GC.SuppressFinalize(this);
    }
}
Re[4]: [Этюд] Сломанный деструктор
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.10 05:06
Оценка:
Здравствуйте, Tepp, Вы писали:

Убедительно, но это совсем не то, чего хотелось бы

Уточню: DontSayGoodbye не должен иметь никаких конструкторов (включая делегирующий, создаваемый компилятором).
Re: [Этюд] Сломанный деструктор
От: k.o. Россия  
Дата: 21.09.10 06:00
Оценка: 12 (1) +1 :)
Здравствуйте, 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]: [Этюд] Сломанный деструктор
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.10 06:02
Оценка:
Здравствуйте, k.o., Вы писали:

Класс Console, конечно, стандартный.
Re: [Этюд] Сломанный деструктор
От: shakm Россия  
Дата: 21.09.10 06:29
Оценка:
скорее всего имеется ввиду какой-то класс, от которго наследован DontSayGoodbye, у которого что-то там сломано :-D
Re: [Этюд] Сломанный деструктор
От: Aznog Россия  
Дата: 21.09.10 07:04
Оценка: 226 (12)
>> ...
>> Как устроен DontSayGoodbye?
    abstract class DontSayGoodbye
    {
        protected abstract void Finalize();
    }
Re[2]: [Этюд] Сломанный деструктор
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.10 07:09
Оценка:
Здравствуйте, Aznog, Вы писали:

Да, именно так!
Re[3]: [Этюд] Сломанный деструктор
От: Tepp  
Дата: 21.09.10 07:26
Оценка:
А как же :"Уточню: DontSayGoodbye не должен иметь никаких конструкторов (включая делегирующий, создаваемый компилятором)." ? =)
Re[4]: [Этюд] Сломанный деструктор
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.10 07:33
Оценка:
Здравствуйте, Tepp, Вы писали:

Согласен, от делегирующего конструктора не избавиться. Можно потребовать, чтобы DontSayGoodbye наследовался напрямую от object и не определял явно конструктор(ов).
Re: [Этюд] Сломанный деструктор
От: _FRED_ Черногория
Дата: 21.09.10 08:33
Оценка: 57 (6)
Здравствуйте, 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: [Этюд] Сломанный деструктор
От: Sinix  
Дата: 21.09.10 08:54
Оценка: 27 (1) +1 :))) :))) :))) :))) :)
Здравствуйте, 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]: [Этюд] Сломанный деструктор
От: Пельмешко Россия blog
Дата: 21.09.10 09:00
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Mab, Вы писали:


Mab>>Как устроен DontSayGoodbye?


_FR>И мои пять копеек:


Всё равно при выгрузке домена отрабатывает
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.