在c#中对同一个对象再次使用new

本文关键字:new 一个对象 | 更新日期: 2023-09-27 18:10:24

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();
        }
    }
}

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

谢谢…

在c#中对同一个对象再次使用new

是和不是。

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

thread1 = new Thread(...)  

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


当您第二次执行时,您正在创建Thread的第二个实例,但您没有破坏旧的实例。你只是覆盖了引用,这只是线程的"地址"。

但是,您确实有垃圾收集器,如果您没有引用它,它将清理第一个线程,因此,如果在某个地方,对第一个线程的引用仍然存在,(例如如果您将其分配给其他变量),它将不会被垃圾收集。

如果"Valid"是指"将编译"answers"将覆盖我的变量",那么是的,它是有效的。

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