什么使表格成为根本参考?

Nik*_*las 1 c# clr reference

跟进什么是"有根参考"的问题?

考虑此代码,对于c#中的标准Windows应用程序:

Program.cs中:

    [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
        finally
        {
            MessageBox.Show("Bye !");
        }
    }
Run Code Online (Sandbox Code Playgroud)

From1.cs:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.Click += new EventHandler(Form1_Click);

    }

    void Form1_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }
}
Run Code Online (Sandbox Code Playgroud)

是什么让这个表格作为根本参考?是因为静态主要方法,我猜它是,还是它还有什么呢?

如果我只是用X关闭表单,那么消息框将显示"再见",但如果我点击它则不会.(因为application.Exit()) - 我觉得奇怪的是考虑main中的finally方法.

那么主要的问题是,什么使形式对象,作为一个根源参考,所以垃圾收集器不会杀死它?

Mar*_*ers 5

Application.Run表单关闭之前,该方法不会终止.您将Form1作为参数的实例传递给Run它,它将成为当前正在运行的方法中的局部变量,因此也是根.

在内部Application.Run实际上创建了一个ApplicationContext包含对表单的引用:

public class ApplicationContext : IDisposable
{
    public Form MainForm
    {
        get { /* ... */ }
        set { /* ... */ }
    }

    public ApplicationContext(Form mainForm)
    {
        this.MainForm = mainForm;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

ApplicationContext随后被提供给RunMessageLoop方法.

  • 为了澄清OP - "ApplicationContext"是根,而不是形式. (2认同)