3
  • 我们从C# 规范中知道引用读/写是原子的。在访问对象成员的语句中,引用也会被原子访问吗?我认为是的,因为它也是一种隐式引用读取,编译器在为其生成代码时必须为其提供原子性。

  • 在同一个语句中,访问对象以访问其成员会导致对象引用被持有,因此当另一个线程创建新实例时它不会被垃圾收集?

  • 那么,如果我们访问链中的成员,是否也会保留最左边的对象引用,这样它就不会被其他线程垃圾收集?

考虑以下代码;

static SomeClass sharedVar;

void someMethod()
{
    SomeClass someLocalVar = sharedVar.memberX.memberY.a;
    operations on someLocalVar...
}

我正在从MSDN 库、C# 规范等或 Microsoft 人员那里寻找有关该主题的官方解释,以确保我没有破坏某些东西并且一切都很好。

4

2 回答 2

3
  1. 是的,所有参考读取都是原子的。
  2. 在字段读取操作期间,从将值压入堆栈直到 .ldfld 命令完成为止,无法收集引用。否则它将允许 CLR 收集您正在使用的对象。让另一个线程创建该值的实例与此问题无关。
  3. 我不完全确定你最后一点的意思,但我认为你对垃圾收集的担心有点太多了。当您仍在使用对象时,CLR 不会删除它。
于 2009-11-13T16:12:57.280 回答
0

你太担心GC了。它不会删除您将来可能引用和访问的任何对象。只有完全无法访问的对象才会被删除。

于 2009-11-13T16:15:10.643 回答