假设一个对象 O 由两个拥有资源的对象 R 和 S 组成。如果 O 被销毁会发生什么?
在带有 RAII 的 C++ 中,对象可以拥有其他对象,因此一个对象的破坏必然与另一个对象的破坏相耦合。如果 O拥有R 和 S——通过按值存储它们,或者通过拥有反过来拥有 R 和 S 的东西(unique_ptr,按值存储 R 和 S 的容器),那么破坏 O 必然会破坏 R 和 S。只要由于 R 和 S 的析构函数会自行清理,因此 O 不需要手动执行任何操作。
相反,C# 对象没有决定其生命周期何时结束的所有者。即使 O 会被确定性地破坏(通常不会),R 和 S 也可能被另一个引用访问。更重要的是,O 引用 R 和 S 的方式与任何其他局部变量、对象字段、数组元素等引用 R 和 S 的方式相同。换句话说,没有办法表明所有权,所以计算机可以' t 决定什么时候该对象应该被销毁,什么时候它只是一个非拥有/借用的引用。您肯定不希望这段代码关闭文件吗?
File f = GetAFile();
return f; // end of method, the reference f disappears
但是就CLR而言,f
这里从local的引用和从O到R/S的引用是完全一样的。
TL;DR所有权。