引用C#中的引用

时间:2013-11-20 14:14:27

标签: c# reference

Supose我创建一个引用另一个变量B的变量B,它们都是引用类型变量。如果我将B或A设置为null,则另一个仍将指向对象实例,该实例将保持不变。

SomeClass A = new SomeClass();
SomeClass B = A;
B = null;                       //A still has a valid reference

这也是如此:

SomeClass A = new SomeClass();
SomeClass B = A;
A = null;                       //B still has a valid reference

但我不希望B引用A引用的实例,我希望B引用A本身。这样,如果B设置为null,则A也将设置为null。这样做有什么优雅,安全(无指针)的方式吗?或者我是否正在尝试做一些违反C#原则的事情?

感谢。

3 个答案:

答案 0 :(得分:9)

您不能像在C ++或C中那样执行此操作。只有当您使用ref参数调用方法时才能引用对象句柄:viz:< / p>

void main_method()
{
    SomeClass A = new SomeClass();
    secondary_method(ref A);
}

void secondary_method(ref SomeClass B)
{
    B = null;   // this has the side effect of clearing the A of main_method
}

答案 1 :(得分:1)

这里的解决方案是这些变量都不直接引用该对象,而是引用一个具有指向实际SomeClass实例的字段的对象实例:

public class Pointer<T>
{
    public T Value {get;set;}
}

Pointer<SomeClass> A = new Pointer<SomeClass>(){ Value = new SomeClass()};
Pointer<SomeClass> B = A;
B.Value = null;    
//A.Value is null

答案 2 :(得分:0)

MSDN对引用类型的定义如下:“引用类型的变量存储对实际数据的引用”(http://msdn.microsoft.com/en-us/library/490f96s2%28v=vs.110%29.aspx)。在您的情况下,将第二个变量设置为null只会导致第二个变量的引用被破坏,而不会对实际数据产生任何影响。 Olivier在Setting a type reference type to null doesn't affect copied type?提供的帖子中清楚地显示了这一点。

您问题的可能解决方案是使用 WeakReference

根据MSDN:“弱引用允许垃圾收集器收集对象,同时仍然允许应用程序访问该对象。如果您需要该对象,您仍然可以获得对它的强引用并防止它收集“(http://msdn.microsoft.com/en-us/library/system.weakreference%28v=vs.110%29.aspx)。

因此,只要第二个(本地)引用访问您的弱引用,该对象就不会被垃圾回收。通过将其设置为null来中断本地引用后,GC将清除弱引用的对象。有关WeakReference的更多信息,请访问:http://msdn.microsoft.com/en-us/library/ms404247.aspx