1

我基本上是一个尝试进入 C# 的 C++ 人。从 C# 的基本教程中,我碰巧发现所有对象都是动态创建和存储的(Java 也是如此)并且可以通过引用访问,因此不需要复制构造函数。在将对象传递给函数或从函数返回对象时,也不需要按位复制。这使得 C# 比 C++ 简单得多。

但是,我在某处读到,仅通过引用对对象进行操作会对可以执行的操作类型施加限制,从而限制了程序员的完全控制。一个限制是程序员无法精确指定对象何时可以被销毁。

有人可以详细说明其他限制吗?(如果需要,提供示例代码)

4

3 回答 3

2

大多数“限制”都是设计使然,而不是被认为是缺陷(您当然可能不同意)

你无法确定/你不必担心

  • 当一个对象被销毁时
  • 对象在内存中的位置
  • 它有多大(除非您正在调整应用程序)
  • 使用指针算术
  • 访问外部对象
  • 访问类型错误的对象
  • 在线程之间共享对象更简单
  • 对象是在栈上还是堆上。(堆栈在 Java 中的使用越来越多)
  • 内存碎片(并非所有收集器都如此)
于 2013-01-11T10:12:59.010 回答
1

由于在 java 中完成垃圾收集,我们无法预测对象何时会被销毁,但它执行析构函数的工作。

如果你想释放一些资源,那么你可以使用 finally 块。

try {


  } finally{
  // dispose resources.     
  }
于 2013-01-11T10:01:55.443 回答
0

进行了类似的转换后,您越深入研究它,您就越需要考虑 C# 在所有情况下的 GC 行为,但最直接的情况除外。在尝试处理托管代码中的非托管资源时尤其如此。

本文重点介绍了您可能感兴趣的许多问题。

就我个人而言,我想念IDisposable的引用计数替代方案(更像 shared_ptr),但这可能是 C++ 背景的宿醉。

我越需要编写自己的管道来支持类似 C++ 的编程,就越有可能存在我忽略的另一种 C# 机制,或者我最终对 C# 感到沮丧。例如,就我所见, swapmove不是 C# 中的常见习语,我很想念它们:其他具有 C# 背景的程序员可能不同意这些习语的有用性。

于 2013-01-11T10:20:38.433 回答