是否在c#中使用了pimpl习语?

时间:2012-04-26 17:44:46

标签: c# c++ pimpl-idiom

我来自C#背景,最近开始学习C ++。我遇到过的一件事是pimpl成语。我为一些大公司做过C#开发,但从未遇到过它。

也许这是错误的,但我的理解是,由于使用了头文件而没有部分类选项,所以在C ++中这是必要的。

但在C#中,我们会一直使用类库构建应用程序。如果库代码中发生了某些变化,我们会将其重新编译为dll并在应用程序项目中引用新的dll。

我真的不明白为什么用C ++不能做同样的事情。 Pimpl看起来像是一个丑陋的黑客。

3 个答案:

答案 0 :(得分:26)

  

是否在c#中使用了pimpl习语?

这取决于你对这个成语的意思。

有问题的习惯用法是将类型的实现细节分成一个类,将公共表面区域分成一个包装类,它只是保存在实现类的指针上。

这有两个好处。

首先,在C ++中,它可以改善编译时间,因为公共表面区域的消费者只需要解析包含公共表面区域的头文件;他们不需要解析包含实现细节的头文件。

其次,它导致界面与实现的非常清晰的分离;实施可以彻底改变而不会对消费者产生任何影响,因为消费者永远不会看到实施细节。

第一个好处是无论在C#中。 C#编译器很快。 (当然,很大一部分原因是因为语言的设计速度很快。)

第二个好处是在C#中有相当大的用处。在C#中,实现这种模式的惯用方法是创建一个执行“真实”工作的私有嵌套类和一个只是公共表面区域外观的公共类。

我在C#中特别喜欢的一种技术是使公共类成为私有嵌套类的基类,为基类提供私有构造函数以防止第三方扩展,并使用工厂模式分发私有嵌套类的实例。

  

我真的不明白为什么用C ++不能做同样的事情。

然后我鼓励你尝试编写一个这样做的C ++编译器。你要么成功创建一个更快的C ++编译器,要么你会发现为什么在C ++中不能做同样的事情。无论哪种方式都有好处!

答案 1 :(得分:4)

是的(是“黑客”)。它是由ANSI C ++的基于文本的编译模型引起的:编译器需要查看代码的文本表示以生成有用的东西。并不是说必须这样,但今天就是这样做的。

答案 2 :(得分:1)

正如埃里克指出的那样,pimpl成语有两个目的。我只想补充一点,第二个目的(分离界面和实现)是众所周知的软件设计模式之一:Bridge(我也认为是Handle / Body)。您可以阅读更多相关信息here