【发布时间】:2014-02-13 09:58:42
【问题描述】:
(我什至不知道我的问题是否有意义;这只是我不明白的东西,并且在我脑海中旋转了一段时间)
考虑有以下类:
public class MyClass
{
private int _myVar;
public void DoSomething()
{
// ...Do something...
_myVar = 1;
System.Console.WriteLine("Inside");
}
}
并像这样使用这个类:
public class Test
{
public static void Main()
{
// ...Some code...
System.Console.WriteLine("Before");
// No assignment to a variable.
new MyClass().DoSomething();
// ...Some other code...
System.Console.WriteLine("After");
}
}
(Ideone)
上面,我正在创建一个类的实例,但没有将其分配给变量。
我担心垃圾收集器会过早删除我的实例。
我对垃圾回收的幼稚理解是:
“只要没有引用指向它,就删除一个对象。”
由于我创建实例时没有将其分配给变量,因此该条件为真。显然代码运行正确,所以我的假设似乎是错误的。
谁能给我我缺少的信息?
总而言之,我的问题是:
(为什么/为什么不)实例化一个类而不将其分配给变量或returning 它是否安全?
即是
new MyClass().DoSomething();
和
var c = new MyClass();
c.DoSomething();
从垃圾收集的角度来看是一样的吗?
【问题讨论】:
-
回答你的总结,是的,完全一样。与直接
new Something().DoSomething();相比,局部变量没有或多或少的保证。甚至局部变量也不能保证在声明它的整个代码块中都存在——唯一的保证是它在最后一次使用之前不会被释放。 -
当您执行
new MyClass().DoSomething();时,我认为第一部分new MyClass()将导致对新实例的引用被放入(推送)到调用堆栈中。即使它不是 C# 代码中的变量,仍然存在对堆栈上实例的引用。只要该引用可能被使用(例如.DoSomething()),就禁止GC 收集实例。那只是我的幼稚理解;我不是专家。
标签: c# .net garbage-collection