powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / new void Dispose()
12 сообщений из 12, страница 1 из 1
new void Dispose()
    #39351058
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс выведенный из базового, у которого где-то внутри есть свой Dispose().

Мне нужен Dispose в моем, но когда добавляю, студия пишет мне что мой спрячет Dispose базового и предлагает сделать так

Вопрос:

Код: c#
1.
2.
3.
4.
5.
6.
public new void Dispose()
{
// всякие мои дестрои

base.Dispose();//<--- это надо?
}
...
Рейтинг: 0 / 0
new void Dispose()
    #39351096
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Код: c#
1.
protected virtual void Dispose(bool disposing)

- этого нужно в наследнике переопределять
(если Dispose по рекомендациям MS реализован)
...
Рейтинг: 0 / 0
new void Dispose()
    #39351144
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Код: c#
1.
public new void Dispose()


У меня для вас плохие новости:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class Foo : IDisposable
{
  public void Dispose()
  {
    Console.WriteLine("Foo.Dispose");
  }
}

class Bar: Foo
{
  public new void Dispose()
  {
    Console.WriteLine("Bar.Dispose");
    base.Dispose();
  }
}

class Program
{
  static void Main()
  {
    using(new Bar()){}
  }
}


- догадайтесь с трех раз, что будет в консольном выводе.
...
Рейтинг: 0 / 0
new void Dispose()
    #39351342
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныРолг Хупин
Код: c#
1.
public new void Dispose()


У меня для вас плохие новости:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class Foo : IDisposable
{
  public void Dispose()
  {
    Console.WriteLine("Foo.Dispose");
  }
}

class Bar: Foo
{
  public new void Dispose()
  {
    Console.WriteLine("Bar.Dispose");
    base.Dispose();
  }
}

class Program
{
  static void Main()
  {
    using(new Bar()){}
  }
}


- догадайтесь с трех раз, что будет в консольном выводе.

И угадайте, что будет, если сделать вот-так:
Код: c#
1.
        class Bar : Foo, IDisposable
...
Рейтинг: 0 / 0
new void Dispose()
    #39351423
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

никаких new, только override!
...
Рейтинг: 0 / 0
new void Dispose()
    #39351567
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronИ угадайте, что будет, если сделать вот-так:
Код: c#
1.
class Bar : Foo, IDisposable


Да что тут угадывать, я и так знаю. Но здесь имеет место быть один нюанс: на уровне IL Bar.Dispose после введения интерфейса будет выглядеть вот так:
Код: c#
1.
method public final hidebysig newslot virtual instance void Dispose () cil managed 


(ключевое слово выделено). Точно так же выглядит определение Dispose у Foo. Т.е. мы вместо переопределения (override) метода:
Код: c#
1.
.method public hidebysig virtual instance void Dispose () cil managed


просто добавили в vtable новый слот с Dispose. При корректной реализации вызовов Dispose базовых классов при приведении к интерфейсу всё будет в порядке. А вот при приведении к классам в иерархии наследования поведение будет меняться в зависимости от того, к чему приводим, и вне зависимости от фактического типа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
namespace test
{
  class Foo : IDisposable
  {
    public virtual void Dispose()
    {
      Console.WriteLine("Foo.DoSome");
    }
  }

  class Bar : Foo, IDisposable
  {
    public new void Dispose()
    {
      Console.WriteLine("Bar.DoSome");
      base.Dispose();
    }
  }

  class Program
  {
    static void Main()
    {
      var b = new Bar();
      b.Dispose();
      Console.WriteLine("=====================");
      ((IDisposable)b).Dispose();
      Console.WriteLine("=====================");
      ((Foo)b).Dispose();
    }
  }
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Bar.DoSome
Foo.DoSome
=====================
Bar.DoSome
Foo.DoSome
=====================
Foo.DoSome

- это потенциальный источник очень трудновылавливаемых граблей.
...
Рейтинг: 0 / 0
new void Dispose()
    #39351633
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Bar.DoSome
Foo.DoSome
=====================
Bar.DoSome
Foo.DoSome
=====================
Foo.DoSome

- это потенциальный источник очень трудновылавливаемых граблей.
Взгляните с другой стороны: описанное повидение является нормальным для всех перегруженух функций. Другими словами, продолжая вашу мысль: все не виртульные функции - потенциальный источник труднообнаружимых ошибок. Я не буду спорить с этим, но в шарпе такие правила игры. И если их принимать как данность то логично две поведенческих модели: или признать переопределение нормальной практикой и удельть этому внимание при разработке, или делать все методы виртуальными.
...
Рейтинг: 0 / 0
new void Dispose()
    #39351638
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronИ если их принимать как данность то логично две поведенческих модели: или признать переопределение нормальной практикой и удельть этому внимание при разработке, или делать все методы виртуальными.
Это крайности, я придерживаюсь середины: не делаю все методы виртуальными, но и переопределение нормой не считаю, и использую его только в самых крайних случаях.
...
Рейтинг: 0 / 0
new void Dispose()
    #39351657
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Это дскретный выбор. Вы выбрали первое, а остальное только ваши личные предпочтения. Если вы работаете с чужим кодом то вам придётся мирится с правилами игры и всегда брать их во внимание. Дрыгими словами пъёте вы чай с сахаром или без не меняет того что вам подадут в кафе. Исли у ТС нет возможности изменить базовый класс, то вполне нормально перегрузить метод и жить с этой болью. ИМХО.
...
Рейтинг: 0 / 0
new void Dispose()
    #39351673
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronИсли у ТС нет возможности изменить базовый класс, то вполне нормально перегрузить метод и жить с этой болью. ИМХО.
Разумеется. Речь о ситуациях, где есть возможность выбора. Да и в случае ТС мы знаем только то, что ему приспичило возиться с наследованием. Хотя, вполне возможно, выходом было бы агрегирование.
...
Рейтинг: 0 / 0
new void Dispose()
    #39351700
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныmikronИсли у ТС нет возможности изменить базовый класс, то вполне нормально перегрузить метод и жить с этой болью. ИМХО.
Разумеется. Речь о ситуациях, где есть возможность выбора. Да и в случае ТС мы знаем только то, что ему приспичило возиться с наследованием. Хотя, вполне возможно, выходом было бы агрегирование.

не приспичило мне, просто нужно сделать обязательно некторые действия на разрушении объекта, а тут такое ;-)
...
Рейтинг: 0 / 0
new void Dispose()
    #39351750
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronИ угадайте, что будет, если сделать вот-так:
Код: c#
1.
        class Bar : Foo, IDisposable


А так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   class Bar : Foo, IDisposable
    {
        public new void Dispose()
        {
            Console.WriteLine("Bar.Dispose");
            base.Dispose();
        }
        void IDisposable.Dispose()
        {
            throw new NotImplementedException();
        }
    }
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / new void Dispose()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]