在C#中的同一个对象上再次使用new

时间:2014-06-26 23:19:58

标签: c# new-operator

namespace usenewagain
{
    class Program
    {
        public static Thread thread1;

        static void Main(string[] args)
        {

            thread1 = new Thread(() => threadsDelegate(TimeSpan.FromMinutes(1), 1) );
            thread1.Start();

            while(thread1.IsAlive)
            {

            }

            thread1 = new Thread(() => threadsDelegate(TimeSpan.FromMinutes(2), 1));
            thread1.Start();

            while(thread1.IsAlive)
            {

            }

            Console.WriteLine("Done...");
            Console.ReadLine();
        }
    }
}

据我所知,在这个控制台程序中使用new on thread1再次是合法的,看起来它工作正常。据我所知,thread1被第二次调用new覆盖。我可以得到一些验证,再次使用new是有效的吗?

谢谢...

2 个答案:

答案 0 :(得分:4)

是和否。

每次使用new时,您都会创建一个新对象,并在变量中将引用存储到该对象。

所以

thread1 = new Thread(...)  

创建Thread的新实例,并在thread1中存储对该实例的引用。


当你第二次这样做时,你正在制作Thread的第二个实例,但你并没有破坏旧的实例。您只是覆盖了引用,这只是该主题的“地址”。

然而,你确实有垃圾收集器,如果没有对它的引用,它将清理第一个线程,所以如果在某个地方,对你的第一个线程的引用仍然存在,(就像你将它分配给其他变量一样),它不会被垃圾收集。

答案 1 :(得分:2)

如果“有效”是指“将编译”和“将覆盖我的变量”,那么是,它是有效的。

然而,这很危险。通过覆盖变量,如果要对其执行Join或任何其他操作,则会丢失对它的任何引用。如果你等待线程Join,顺便说一下你的旋转等待,这是一个安全的操作。