【发布时间】:2015-12-02 16:23:16
【问题描述】:
我是面向对象代码的新手,我想知道这段代码是否安全。 我有一个本地列表“TempCand”,它分配给该类的静态成员列表“候选人”。当我离开搜索方法时,我担心我的局部变量的内存会受到垃圾收集,这会影响我的静态变量。或者这样可以吗?
public class search
{
class candidate
{
// ...
}
static List <candidate> Candidates = new List <candidate>();
static public void clean_Candidates()
{
List <candidate> TempCand = new List <candidate>();
// ...
// copy some elements of Candidates in clean_Candidates()
// ...
Candidates = TempCand;
}
}
【问题讨论】:
-
从 GC 的角度来看,我没有看到问题,但从线程安全的角度来看,我确实看到了一个问题。您编写的代码看起来不是线程安全的。
-
@RonBeyer 这很可能是线程安全类的一部分,具体取决于使用
Candidates的其他方法如何工作。 -
别担心了;你可以相信GC。它唯一的工作就是确保这些东西在需要的时候保持活力,并在以后被清理掉。
-
@JonHanna 它可能还有更多内容,但我们所能做的就是评论提供的代码,而不是推测没有提供的代码。正如其所写,没有看到“字里行间”是什么,它不是线程安全的。
-
经验法则:如果有办法告诉您收集了特定对象,则不会收集该对象。所以,任何时候你说,“我担心 X 会被收集并导致问题 Y”,那么你可以放心 X 不会被收集,因为 Y 会让你注意到。反例大多只适用于非常先进的技术(例如,使用
WeakReference类)。我想也有人会争辩说终结器的集合是可观察的,但这几乎与WeakReference集合是可观察的一样明显(并且终结器是一种高级技术,imo)。
标签: c# variables static local assign