Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将实例设置为null,而不是引用它的变量_C#_Reference_Null - Fatal编程技术网

C# 将实例设置为null,而不是引用它的变量

C# 将实例设置为null,而不是引用它的变量,c#,reference,null,C#,Reference,Null,我创建了一个对象,并将其分配给在不同类中找到的两个变量 如果在一个类中,我将变量设置为null,它只会中断对对象的引用,但由于另一个引用,对象本身仍然存在 如何将对象设置为null,以便两个引用都指向null?没有找到所有的参考资料 这是伪代码。这样做的目的是丢失ClassA(参考文献1)和ClassB(参考文献2)中的引用 你不能 您无法深入到另一个类的内部(嗯,不是常规的)。这种形式的封装使得.Net代码更容易调试 您可以在类上编写一个函数,将其所有成员设置为null,这可以作为IDispo

我创建了一个对象,并将其分配给在不同类中找到的两个变量

如果在一个类中,我将变量设置为null,它只会中断对对象的引用,但由于另一个引用,对象本身仍然存在

如何将对象设置为null,以便两个引用都指向null?没有找到所有的参考资料

这是伪代码。这样做的目的是丢失ClassA(参考文献1)和ClassB(参考文献2)中的引用

你不能

您无法深入到另一个类的内部(嗯,不是常规的)。这种形式的封装使得.Net代码更容易调试

您可以在类上编写一个函数,将其所有成员设置为
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;
        }
    }
}