C# - Что делает “деструкторы, не наследованы” на самом деле средние?

Можно всегда использовать команду "mysqladmin завершение работы"

13
задан Secret Squirrel 9 December 2009 в 17:49
поделиться

1 ответ

Вопрос не в победе . Я изо всех сил пытаюсь понять ваши вопросы, но вы, кажется, озабочены защитой от полностью воображаемых атак.

Оставляя это в стороне и рассматривая ваши вопросы по одному:

Мой вопрос в том, что означает «деструкторы не унаследованы "на самом деле означают, хотя вы не можете позвонить деструктор явно, деструкторы в цепочка наследования называется автоматически и базовый класс деструкторы вызываются, даже если производный класс не определяет деструктор?

Это на самом деле означает, что деструкторы базового класса не являются членами производного класса .

Мой встречный вопрос: «Почему вы считаете, что факты что (1) вы не можете вызвать деструктор напрямую, (2) деструкторы в цепочке наследования вызываются автоматически при сборе и (3) вызываются деструкторы базового класса, даже если производный класс не определяет конструктор, иметь какие-либо касающийся вопроса о том, является ли деструктор базового класса членом производного класса?

Имеет ли это отношение к некоторой тонкой семантике? различие, что завершение реализован сборщиком мусора а не язык / компилятор C #?

Нет.

Язык C # - это спецификация; он ничего не реализует. Компилятор C # реализует спецификацию; он определенно не «реализует доработку». CLR - это то, что реализует финализацию.

Независимо от этого, тот факт, что деструкторы в базовом классе не являются членами производного класса, не имеет никакого отношения к тому, как финализация реализуется сборщиком мусора CLR.

В конце мы вернемся к вопросу о семантике завершения CLR и почему они не имеют отношения к вопросу о наследовании.

Хотя в спецификации языка C # также указано что "конструкторы экземпляров не унаследовано ", поведение в отношении конструкторам значительно отличается от десктрукторов и подходит лучше IMO с "не наследуется" терминология

Хорошо, я согласен, что вы в это верите. Почему вы считаете, что такое поведение имеет отношение к вопросу о наследовании? Я ни в малейшей степени не понимаю, почему вы так считаете. К наследованию относится то, является ли рассматриваемая сущность членом производного типа просто в силу того, что она является членом базового типа.

Я согласен с тем, что тот факт, что конструктор базового типа не может быть вызван напрямую через конструкцию производного типа, в котором отсутствует этот конструктор, согласуется с тем фактом, что конструкторы не наследуются. Я просто не понимаю, какое отношение это имеет к вопросу о наследовании деструкторов.

Более уместным фактом является то, что базовый класс с общедоступным конструктором без параметров ДЕЙСТВИТЕЛЬНО имеет этот конструктор, вызываемый, когда производный класс, в котором отсутствует общедоступный конструктор без параметров, создается с его конструктором по умолчанию. Производный класс не наследует открытый конструктор без параметров базового класса, но тем не менее вызывается. Если вы согласны с тем, что конструктор, не унаследованный, может быть вызван таким образом, то почему бы не согласиться с тем, что деструктор также вызывается с аналогичной семантикой?

Я просто хочу сказать, что у меня есть встретил много людей, которые не понять или понять, что это то, что случается, и значительная часть причина этого - "деструкторы не унаследованы ».

Я полностью согласен. Вероятно, не следует писать деструкторы, если у вас нет четкого понимания того, что именно является правильной семантикой. Я встревожен количеством книг для начинающих на C #, которые рассматривают деструкторы как подходящая тема для новичков; написание правильного деструктора - одна из самых сложных базовых задач в C #.

Поскольку внутренняя часть реализация, по сути, основана на наследование, как указано выше, я думаю мой вопрос действителен

Ваш вопрос верен независимо от того. Но теперь вы объединяете детали реализации функции со спецификацией этой функции.

По аналогии рассмотрим анонимные типы. Разумеется, имен у них нет. Но метаданные, которые мы выплевываем, конечно же, называют тип; CLR требует, чтобы типы имели имена. Это противоречие? На самом деле, нет. Концептуальная сущность, называемая в спецификации «анонимным типом», не имеет имени, и вот что важно. Разработчик, конечно, может свободно использовать платформу, которая не требует именования всех типов.

Точно так же наша реализация C # реализует деструкторы, вставляя IL в метод, который отменяет виртуальный метод с именем Finalize. Язык C # был тщательно разработан, чтобы не зависеть от этой функции среды выполнения. Другая реализация C # совершенно свободна для выбора другого механизма реализации деструкторов. (Возможно, нам стоит изменить спецификацию, чтобы прояснить, что информация о том, как реализованы деструкторы, является информативной деталью реализации, а не требованием языка C #.)

Но независимо от выбора. Что касается деталей реализации, деструкторы в базовом классе не являются членами производного класса. Точно так же, независимо от деталей реализации, анонимные типы не имеют имен.

Теперь все ясно или у вас есть еще вопросы?

(Возможно, нам стоит изменить спецификацию, чтобы прояснить, что информация о том, как реализованы деструкторы, является информативной деталью реализации, а не требованием языка C #.)

Но независимо от выбора. Что касается деталей реализации, деструкторы в базовом классе не являются членами производного класса. Точно так же, независимо от деталей реализации, анонимные типы не имеют имен.

Теперь все ясно или у вас есть еще вопросы?

(Возможно, нам стоит изменить спецификацию, чтобы прояснить, что информация о том, как реализованы деструкторы, является информативной деталью реализации, а не требованием языка C #.)

Но независимо от выбора. Что касается деталей реализации, деструкторы в базовом классе не являются членами производного класса. Точно так же, независимо от деталей реализации, анонимные типы не имеют имен.

Теперь все ясно или у вас есть еще вопросы?

19
ответ дан 1 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: