Ответ 1
Является ли идиома pimpl, используемая в С#?
Это зависит от того, что вы подразумеваете под этой идиомой.
Идиома, по сути, заключается в том, чтобы разделить детали реализации типа на один класс и область общей поверхности в класс-оболочку, который просто удерживает указатель на класс реализации.
Это имеет два преимущества.
Во-первых, на С++ это может привести к улучшению времени компиляции, поскольку потребителям области публичной поверхности необходимо только проанализировать заголовочный файл, содержащий общую площадь поверхности; им не нужно анализировать заголовочный файл, содержащий детали реализации.
Во-вторых, это приводит к очень четкому разделению интерфейса от реализации; реализация может полностью измениться без какого-либо влияния на потребителя, поскольку потребитель никогда не видит детали реализации.
Первое преимущество не имеет значения в С#. Компилятор С# работает быстро. (В значительной степени, конечно, потому что язык был разработан для быстрой компиляции.)
Второе преимущество значительного использования в С#. В С# идиоматическим способом реализации этого шаблона было бы создание частного вложенного класса, который выполняет "настоящую" работу и открытый класс, который является просто фасадом с общей площадью поверхности.
Метод, который мне особенно нравится в С#, заключается в том, чтобы сделать публичный класс базовым классом частного вложенного класса, дать базовому классу частный конструктор для предотвращения расширения третьей стороны и использовать шаблон factory для раздачи экземпляров частный вложенный класс.
Я действительно не понимаю, почему то же самое нельзя делать с С++.
Затем я рекомендую вам попытаться написать компилятор С++, который сделает это. Вам удастся создать намного более быстрый компилятор С++, или вы узнаете, почему то же самое нельзя сделать на С++. Вы выигрываете в любом случае!