3

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

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

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

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


编辑

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

有什么办法吗?

4

4 回答 4

10

您需要添加一个额外的间接层。用 C++ 术语来说,MyClass是一个指向对象的指针,因此要将两个指针都设置为 null,您需要将指针传递给指针,以便您可以将指向指针的指针解析为仅指向指针的指针,将其设置为 null , 并且两个双指针都将解析为null.

在 C# 中添加额外的间接层通常意味着创建一个新类。

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

使用它,我们可以使alphaand betaeach 成为Wrapper<MyClass>对象(确保它们都是 的相同实例Wrapper),并且要影响两个“指针”,您只需将to设置Value为.Wrappernull

于 2013-01-16T20:41:39.977 回答
0

除非您的类包含一次性对象,否则不需要 Dispose 对象,并将其设置为 null 只会使对象为 null ,这不会释放内存,但如果您稍后需要检查该对象会有所帮助...

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

于 2013-01-16T20:44:11.870 回答
0

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

MyClass beta = new MyClass();
MyClass alpha = beta;
beta.Dispose();

alpha.Method(); // should throw  ObjectDisposedException.
于 2013-01-16T20:44:23.373 回答
0

你也不需要这样做。C# 内存是自动管理的,因此当没有更多对它们的引用时,它们会被释放。如果您因为捕获了 OutOfMemoryException 而特别释放某些东西,那么是的,您可以开始将其设置为 null 并强制垃圾收集器,正如@JanesAbouChleih 指出的那样。.Dispose调用该方法并实现可能需要的任何其他清理代码MyClass(关闭文件、刷新缓冲区等)要好得多。

一些参考资料:

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

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

此外,关于如何/何时/为什么处置东西的类似问题:你需要处置对象并将它们设置为空吗?

于 2013-01-16T20:46:20.593 回答