C# 将实例设置为null,而不是引用它的变量
我创建了一个对象,并将其分配给在不同类中找到的两个变量 如果在一个类中,我将变量设置为null,它只会中断对对象的引用,但由于另一个引用,对象本身仍然存在 如何将对象设置为null,以便两个引用都指向null?没有找到所有的参考资料 这是伪代码。这样做的目的是丢失ClassA(参考文献1)和ClassB(参考文献2)中的引用 你不能 您无法深入到另一个类的内部(嗯,不是常规的)。这种形式的封装使得.Net代码更容易调试 您可以在类上编写一个函数,将其所有成员设置为C# 将实例设置为null,而不是引用它的变量,c#,reference,null,C#,Reference,Null,我创建了一个对象,并将其分配给在不同类中找到的两个变量 如果在一个类中,我将变量设置为null,它只会中断对对象的引用,但由于另一个引用,对象本身仍然存在 如何将对象设置为null,以便两个引用都指向null?没有找到所有的参考资料 这是伪代码。这样做的目的是丢失ClassA(参考文献1)和ClassB(参考文献2)中的引用 你不能 您无法深入到另一个类的内部(嗯,不是常规的)。这种形式的封装使得.Net代码更容易调试 您可以在类上编写一个函数,将其所有成员设置为null,这可以作为IDispo
null
,这可以作为IDisposable
的实现
当没有对对象的引用时,垃圾收集器将回收内存,您不能直接控制它
你可以这样重写你的例子
public class A
{
private C c = new C();
static void Main(string[] args)
{
c.Dispose();
c = null;
}
}
public static class B
{
private static C c;
public static LastC
{
get
{
return c;
}
set
{
c = value;
}
}
}
public class C : IDisposable
{
public C()
{
B.C = this;
}
public void Dispose()
{
if (B.LastC == this)
{
// LastC has not been set by another instance.
B.LastC = null;
}
}
}
您会注意到,我已经使静态引用可以通过setter访问,以便其他类可以访问它。
将null设置为引用类型变量只会更改该特定变量的值-对对象的引用。Jon Skeet的好文章-http://www.yoda.arachsys.com/csharp/parameters.html
在您的情况下,最好将对象包装成单例模式。因此,将null设置为main变量将破坏对对象的唯一引用,并且可以对其进行垃圾收集。
这根本不可能 引用可以是
null
或指向实际实例。分配时,如ref2=c代码>将一个引用的值复制到另一个引用。之后,您有两个对同一实例的引用。(当然,不会复制实例,只复制引用;这些是引用类型。)
当您执行ref1=null代码>只会用指向“nothing”的引用覆盖特定引用。它不会破坏任何实例,只会对其他对象进行一个引用“指向”。其他引用不受影响(当前执行方法的ref
或out
的方法参数实际上可能是同一个引用,即转到其他地方的点的引用)
在问题标题中,您说“将实例设置为null”,但这并没有真正意义,因为实例是一个对象(而不是引用)
那么如何销毁一个实例呢?你不能。垃圾收集器可能会在某个时刻(当您即将分配新对象时)出现,并看到一些实例没有对它们的引用。然后,它将从内存中删除这些实例
你不能“零”别人的参考资料。仅仅因为您有一个实例引用,就没有办法说“搜索整个应用程序,找到其他恰好指向同一实例的引用,然后更改所有这些引用。这将是一件非常可怕的事情,因为人们永远无法确定他们的变量何时会突然发生变化。创建另一个对象来封装现有的对象。为什么要这样做?也许会有帮助,但还不够确定,因为你没有详细描述problem@qxg:尽管如此,如果存在(考虑附加的事件处理程序等),您仍然不会丢失对内部类的所有引用。如果两个类对象持有对同一成员的引用,尝试从其中一个对象中清除它会破坏封装范例。第二个对象不知道,它的成员已为空。这个Jon Skit是谁;这是一个伟大的回应!
public class A
{
private C c = new C();
static void Main(string[] args)
{
c.Dispose();
c = null;
}
}
public static class B
{
private static C c;
public static LastC
{
get
{
return c;
}
set
{
c = value;
}
}
}
public class C : IDisposable
{
public C()
{
B.C = this;
}
public void Dispose()
{
if (B.LastC == this)
{
// LastC has not been set by another instance.
B.LastC = null;
}
}
}