在c#中设置引用为null

本文关键字:null 引用 设置 | 更新日期: 2023-09-27 17:53:39

我一直在寻找这个信息很长时间了。从没见过有人问这样的问题。我知道我们可以在c#不安全代码中使用指针,但事实并非如此。问题是:

MyClass beta = new MyClass();
MyClass alpha = beta;
beta = null;

我现在需要做的是将beta设置为null,并将alpha设置为null。假设我在一个函数中返回了,所以我不能再访问它了,那么,我怎么能把它设为空呢?在c++中,如果beta和alpha是指针,我可以释放beta指向的内存,但我不知道c#中如何做到这一点。

以更基本的方式,假设我必须将两个变量设置为null,但我只能访问其中一个。


编辑

我确实看到了一些与我所做的问题无关的答案。我再解释一遍。我正在创建一个类,做一些运动效果,并返回一个实例,可用于暂停或停止此运动。使用这个类的程序员在使用 if(variable != null) 之前使用它来测试变量。我需要的是当运动结束时,他们拥有的实例变成null,这样他们就知道它不再有用了。

有什么办法吗?

在c#中设置引用为null

您需要添加额外的间接层。用c++的术语来说,MyClass是一个指向对象的指针,所以要将两个指针都设置为空,你需要将指针传递给指针,这样你就可以将指针指向指针解析为指针,将其设置为空,两个双指针将解析为null

在c#中添加一个额外的间接层通常意味着创建一个新类。
public class Wrapper<T>
{
    public T Value { get; set; }
}

使用它,我们可以使alphabeta都是Wrapper<MyClass>对象(确保它们都是Wrapper的相同实例),并且要影响两个"指针",您可以将WrapperValue设置为null

除非你的类包含一个可丢弃的对象,否则不需要Dispose对象,并且将其设置为null只是使对象为空,这不会释放内存,但如果你需要稍后检查对象,则会有所帮助…

如果你的类需要被标记为一次性的,因为它需要清理它的内存使用,请考虑让你的类继承自IDisposable!接口。

如果您需要获得某种AV/异常(以匹配访问已删除对象的c++行为),您可以获得的最接近的方法是使对象IDisposable,并使所有方法/属性在对象被处置后抛出(类似于流派生对象的行为)。

MyClass beta = new MyClass();
MyClass alpha = beta;
beta.Dispose();
alpha.Method(); // should throw  ObjectDisposedException.

您不需要这样做。c#内存是自动管理的,所以当不再引用它们时,它们就会被释放。如果你特别想要释放一些东西,因为你已经捕获了一个OutOfMemoryException,那么是的,你可以开始设置为空,并强制垃圾收集器@JanesAbouChleih指出。最好调用.Dispose方法并实现MyClass可能需要的任何其他清理代码(关闭文件,刷新缓冲区等)。

参考:http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

http://msdn.microsoft.com/en-us/library/ms973837.aspx

同样,关于如何/何时/为什么处置事物的类似问题:您是否需要处置对象并将其设置为null?