com本质论--IUnKnown十条制导准则

来源:互联网 发布:xp 网络打印机 编辑:程序博客网 时间:2024/04/29 18:44

调用AddRef方法的情形:

1 当把一个非空接口指针写到局部变量中时.

2 当被调用方把一个非空接口指针写到方法或者函数的[ont]或则[in,out]参数中时.

3 当被调用方返回一个非空接口指针作为函数的实际结果时.

4 当把一个非空接口指针写到对象的一个数据成员中时.

调用Release方法的情形:

1 在改写一个非空局部变量或者数据成员之前.

2 在离开非空局部变量的作用域(scope)之前.

3 当被调用方要改写方法或者函数的[in,out]参数,并且参数的初始值为非空时.([out]参数往往被假定"输入时为空值",所以被调用方永远也不必释放[out]参数.

4 在改写一个对象的非空数据成员之前.

5 在离开一个对象的析构函数之前,并且这时还有一个非空接口指针作为数据成员.

 当把接口指针作为[in]参数传给函数时的特殊规则:

1 当调用方把一个非空接口指针通过[in]参数传给一个函数或者方法时,既不需要调用AddRef,也不需要调用Release,因为在调用堆栈中,临时变量的生命周期只是"用于初始化形式参数"的表达式的生命周期的一个子集.

如果拜读过候捷老师译的书<<inside面向对象模型>>的话,对这十条准则就比较好理解,连系到C++中拷贝构造函数和赋值函数与把对象作为值传递给成员函数和把对象作为返回值返回的关系做对比就好多了,很庆幸没有错过<<COM本质论>>,尽管这本书才刚刚开始读,却已经收益非浅,对dotNet的前身至少也有了个大体的轮廓.其中interface从struct发展而来的事实让我觉得不可思议.不支持多继承的原因竟然是为了基类的二进制表示与编译器无关.不知道后面还会有什么发现.期待啊......

事实证明,DON BOX的大作是绝对不能放过的.