Ответ 1
Это не вопрос победы. Я стараюсь понять ваши вопросы, но вы, похоже, озабочены защитой от совершенно мнимых атак.
Оставляя это в стороне и учитывая ваши вопросы по очереди:
Мой вопрос - что такое деструкторы не наследуются "на самом деле означает, поскольку, хотя вы не можете позвонить деструктор явно, деструкторы в цепочка наследования называется автоматически, и базовый класс деструкторы вызываются, даже если производный класс не определяет деструктор?
На самом деле это означает, что деструкторы базового класса не являются членами производного класса.
Мой встречный вопрос: "Почему вы считаете, что факты, которые (1) вы не можете назвать деструктором напрямую, (2) деструкторы в цепочке наследования вызываются автоматически после сбора, и (3) деструкторы базового класса называются даже если производный класс не определяет конструктор, имеет какое-либо отношение к вопросу о том, является ли деструктор базового класса членом производного класса?
Относится ли она к некоторым тонким семантическим что окончательная доработка реализованный сборщиком мусора а не язык С#/компилятор?
Неа.
Язык С# является спецификацией; он ничего не реализует. Компилятор С# реализует спецификацию; он, конечно же, не "реализует финализацию". CLR - это то, что реализует финализацию.
Независимо от этого, тот факт, что деструкторы в базовом классе не являются членами производного класса, не имеет ничего общего с тем, как завершение выполняется сборщиком мусора CLR.
Мы вернемся к вопросу о семантике завершения CLR и почему они не имеют отношения к вопросу о наследовании в конце.
В то время как спецификация языка С# также заявляет что "конструкторы экземпляров не наследуется", поведение в отношении для конструкторов значительно отличается от дескрипторов и подходит лучше ИМО с "не унаследованным" терминология
Хорошо, я согласен с тем, что вы этому верите. Почему вы считаете, что такое поведение имеет отношение к вопросу о наследовании? Я нисколько не слежу за тем, почему вы этому верите. Что имеет отношение к наследованию, является ли рассматриваемый объект членом производного типа просто потому, что он является членом базового типа.
Я согласен, что тот факт, что конструктор базового типа не может быть вызван непосредственно через конструкцию производного типа, который не имеет этого конструктора, согласуется с тем, что конструкторы не наследуются. Я просто не понимаю, как это связано с вопросом о том, наследуются ли деструкторы.
Более серьезным фактом является то, что базовый класс с открытым безпараллельным конструктором DOES имеет этот конструктор, который вызывается, когда производный класс, который не имеет открытого конструктора без параметров, строится с его конструктором по умолчанию. Полученный класс не наследует открытый безразмерный конструктор базового класса, но он тем не менее называется. Если вы соглашаетесь с тем, что конструктор, а не наследуемый, может быть вызван таким образом, то почему бы не признать, что деструктор также вызывается с помощью подобной семантики?
Моя точка зрения заключается в том, что у меня есть столкнулись с многими людьми, которые не понять или понять, что это происходит, и значительная часть причиной этого являются "деструкторы" не наследуются ".
Я полностью согласен. Вероятно, нельзя писать деструкторы, если у вас нет четкого понимания того, что такое правильная семантика. Меня смущает количество книг для начинающих С#, которые рассматривают деструкторов как подходящую тему для новичков; написание правильного деструктора является одной из самых сложных задач на С#.
Поскольку под капотом реализация на самом деле основана на Наследование, как указано выше, я думаю мой вопрос действительно
Ваш вопрос абсолютно важен. Но теперь вы объединяете детали реализации функции со спецификацией функции.
По аналогии рассмотрим анонимные типы. Достаточно разумно, у них нет имен. Но метаданные, которые мы плеем, конечно, называет тип; CLR требует, чтобы типы имели имена. Это противоречие? На самом деле, нет. Концептуальный объект, называемый "анонимным типом" по спецификации, не имеет имени, и это важно. Конечно, разработчик может свободно использовать платформу, которая не требует именования всех типов.
Аналогично, наша реализация С# реализует деструкторы, вытесняя IL в метод, который переопределяет виртуальный метод Finalize. Язык С# был тщательно разработан, чтобы не зависеть от этой функции среды выполнения. Другая реализация С# совершенно свободна в выборе другого механизма для реализации деструкторов. (Это может быть хорошей идеей для нас, чтобы изменить спецификацию, чтобы было более ясно, что бит о том, как реализуются деструкторы, представляет собой информативную деталь реализации, а не требование языка С#.)
Но независимо от выбора деталей реализации деструкторы в базовом классе не являются членами производного класса. Так же, как и вне зависимости от деталей реализации, анонимные типы не имеют имен.
Теперь ясно, или у вас больше вопросов?