Что заставляет форму оставаться в качестве корневой ссылки? - PullRequest
1 голос
/ 10 декабря 2011

Последующий вопрос от Что такое «корневая ссылка»?

рассмотрим этот код для стандартного приложения windows в c #:

Program.cs:

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

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

Что заставляет эту форму оставаться в качестве корневого источника? Это из-за метода Static Main, наверное, или это что-то еще?

Если я просто закрою форму с помощью X, то в окне сообщения появится «пока», но не если я нажму на него. (из-за application.Exit ()) - и я думаю это странно, если рассмотреть метод finally в main.

Итак, главный вопрос: что делает объект формы, оставаясь в качестве корневого источника, чтобы сборщик мусора не убил его?

Ответы [ 2 ]

5 голосов
/ 10 декабря 2011

Метод Application.Run не прекращается, пока ваша форма не закроется.Вы передаете свой экземпляр Form1 в качестве параметра Run, и он становится локальной переменной в методе, который в данный момент выполняется , и, следовательно, корнем.

Внутренне Application.Run фактически создает ApplicationContext, который содержит ссылку на форму:

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

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

    // ...
}

Затем ApplicationContext присваивается методу RunMessageLoop.

2 голосов
/ 10 декабря 2011

В основе экземпляра Form1 лежит то, что если вы будете следовать всем ссылочным объектам назад, вы в конечном итоге найдете ссылку в статической переменной (которая является корневой ссылкой).Чтобы перейти по пути к корневой ссылке:

  • Экземпляр Form1 сохраняется в поле экземпляра во вновь созданном экземпляре ApplicationContext.
  • Этот экземпляр ApplicationContextхранится в виде поля экземпляра в экземпляре ThreadContext.
  • Этот экземпляр ThreadContext хранится в статической переменной в ThreadContext class <- ROOTED REFERNCE </li>
...