L'idioma di pimpl utilizzato in C#?
Dipende da cosa intendi con questo idioma.
L'idioma in questione è essenzialmente quello di separare i dettagli di implementazione di un tipo in una classe, e l'area della superficie pubblica in una classe wrapper che si limita a tenere un puntatore alla classe di implementazione.
Questo ha due vantaggi.
Innanzitutto, in C++ può portare a miglioramenti nel tempo di compilazione perché i consumatori dell'area pubblica devono solo analizzare il file di intestazione contenente l'area della superficie pubblica; non hanno bisogno di analizzare il file di intestazione contenente i dettagli di implementazione.
In secondo luogo, porta ad una separazione molto netta dell'interfaccia dall'implementazione; l'implementazione può cambiare completamente senza che ci sia alcun impatto sul consumatore, perché il consumatore non vede mai i dettagli dell'implementazione.
Il primo vantaggio non ha importanza in C#. Il compilatore C# è veloce. (In gran parte ovviamente perché il linguaggio è stato progettato per essere veloce da compilare.)
Il secondo vantaggio è di notevole utilizzo in C#. In C# il modo idiomatico di implementare questo modello sarebbe quello di creare una classe nidificata privata che fa il lavoro "reale" e una classe pubblica che è solo una facciata con l'area della superficie pubblica.
Una tecnica mi piace particolarmente in C# è quello di rendere la classe pubblica della classe di base della classe privata nidificato, dare la classe base di un costruttore privato per evitare l'estensione di terze parti, e utilizzare il modello di fabbrica per distribuire le istanze della classe nidificata privata.
Non capisco davvero perché la stessa cosa non può essere fatta con C++.
Quindi vi incoraggio a tentare di scrivere un compilatore C++ che lo faccia. Riuscirai a creare un compilatore C++ molto più veloce, o scoprirai perché la stessa cosa non può essere fatta in C++. Beneficio in entrambi i modi!
fonte
2012-04-26 18:07:18
Non è "necessario" in C++, è semplicemente lì per risparmiare sui tempi di costruzione (e in alcuni casi per mantenere la compatibilità binaria). Se C++ compilato/collegato alla velocità di compilazione di C#, dubito che qualcuno si preoccupi di farlo. – ildjarn
Potresti trovare il post di Eric Lippert, [How Many Passes] (http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx), di interesse. – Brian