C# абстрактный класс

Компилятор компилирует абстрактный класс на C#?

Если да, то как компилятор обрабатывает абстрактный класс, как обычный класс, или есть какая-то разница.

А если нет, то как это разрешает наследование членов данных и функции-члена абстрактного класса в производном классе.

Да, компилятор компилирует абстрактные классы. Он генерирует IL для абстрактных классов - потому что CLR также понимает абстрактные классы. Он отличается от неабстрактного класса всеми способами, описанными здесь: docs.microsoft.com/en-us/dotnet/csharp/language-reference/… Не могли бы вы уточнить, о чем вы спрашиваете?

Jon Skeet 10.06.2018 09:47

Я думаю, вы можете ответить сами, используя декомпилятор, чтобы проверить, присутствует ли абстрактный класс или нет :-)

CodeNotFound 10.06.2018 09:51

Если у вас есть абстрактный класс под названием C, он компилируется в следующий IL: .class private auto ansi abstract beforefieldinit YourNamespace.C extends [mscorlib]System.Object {}

Sebastian Hofmann 10.06.2018 10:30

Вы можете скомпилировать проект библиотеки, содержащий абстрактный класс, в dll, а затем использовать эту dll в другом месте для расширения от этого абстрактного класса - так что этот абстрактный класс должен быть скомпилирован в эту dll.

Hans Kesting 10.06.2018 11:38

Мне любопытно, почему вы думаете, что абстрактные классы не могут компилироваться?

Amit 10.06.2018 12:06

Потому что абстрактный класс не следует рассматривать как настоящий класс для C#. Компилятор рассматривает его как мнимый класс.

Prashant Choudhary 11.06.2018 15:17

@PrashantChoudhary, почему ты так думаешь? Почему бы ему не быть «настоящим» классом или даже «воображаемым»?

Sebastian Hofmann 12.06.2018 21:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
132
1

Ответы 1

Абстрактный класс действительно ведет себя как обычный класс в IL, единственное отличие - добавленный флаг / ключевое слово abstract.

Общий публичный класс в IL выглядит так (без тела)

.class public auto ansi beforefieldinit 
  NAMESPACE.CLASS_NAME
    extends [mscorlib]System.Object

абстрактный класс выглядит так

.class public abstract auto ansi beforefieldinit 
  NAMESPACE.CLASS_NAME
    extends [mscorlib]System.Object

I can recommend you creating test assemblys and browsing them with dotPeek from JetBrains (its a free tool). You can look trough the code and the IL code at the same time.

Другие вопросы по теме