【问题标题】:Public LinkedList公共链表
【发布时间】:2011-09-07 14:34:15
【问题描述】:

我的 C# 代码有问题。目前,我尝试使用多个窗口编写 Windows 窗体应用程序。 现在我的问题:

在第一个窗口中,我有一个包含一些值的组合框。当我单击一个按钮时,会打开第二个窗口,并且应该可以在第一个表单上向该组合框添加一个值。

问题在于,在第一个窗口中,我的值所在的 LinkedList。

像这样:

public LinkedList<String> sample = new LinkedList<String>();


hase.AddFirst("test");
combobox.Items.AddRange(sample.ToArray());

现在,在第二个窗口中 LinkedList 不可用,即使我将其公开。 解决此问题的最佳方法是什么?

希望你能理解我的问题...

哈拉尔

【问题讨论】:

  • 您如何尝试访问另一个窗口中的链接列表?您的 LinkedList 是一个实例变量。您需要将链接列表传递给新窗口(或传递整个窗口) - 静态访问它是行不通的。

标签: c# winforms linked-list


【解决方案1】:

如果不确切知道如何尝试访问 LinkedList,很难说它为什么不适合您。

让我们来看看你有什么。您有一个 LinkedList,它是表单上的一个实例变量。由于这个 LinkedList 是一个实例变量,所以它与表单的实例相关联。

下面的这个例子,将工作,因为它试图静态访问它:

public class MyForm : Form
{
    public LinkedList<string> _list = new LinkedList<string>();
}

public class MySecondForm : Form
{
    public void Window_Loaded(object sender, EventArgs e)
    {
        MyForm._list.AddFirst("This doesn't work");
        //WRONG! list is an instance variable we are trying to access statically.
    }
}

所以,我们可以看到这不起作用。我们有几个选项可以让这个工作。首先,一个非常糟糕的解决方案是让list 成为静态。不要使用此选项。它为并发问题打开了大门,可能会泄漏强引用等。通常,由于这些原因,我不鼓励使用静态(如单例)传递数据。单例模式有时间和地点,但我不认为是这样,因为它很容易避免。

好的,既然我们已经解决了不好的解决方案,那么让我们看看一些可能的好解决方案。

MySecondForm 上设置列表。你有几个选择。构造函数、属性或方法。例如:

public class MyForm : Form
{
    private LinkedList<string> _list = new LinkedList<string>();

    public void Button1_Click(object sender, EventArgs e)
    {
        var secondForm = new MySecondForm();
        secondForm.SetList(_list);
        secondForm.ShowDialog();
        MessageBox.Show(_list.First.Value);
    }
}

public class MySecondForm : Form
{
    private LinkedList<string> _list;

    public void Window_Loaded(object sender, EventArgs e)
    {
        this._list.AddFirst("This will work");
    }

    public void SetList(LinkedList<string> list)
    {
        _list = list;
    }
}

这是一种可能的解决方案。构造函数是Billy 建议的另一种可能的解决方案。

因为LinkedList 是一个引用类型,所以你对MySecondForm 的实例所做的任何更改都会反映在MyForm 的链表中。

【讨论】:

  • 谢谢,这解决了我的问题!非常简单:)
  • @user896692 没问题。通过单击对您有帮助的答案旁边的复选标记,确保将答案标记为答案。
【解决方案2】:

您始终可以将其传递到第二个窗口。正如 vcsjones 在下面指出的那样,如果要重新分配列表,则只需要添加 ref 关键字。您将需要一个将链表作为变量的构造函数。

SecondWindow secondWindow = new SecondWindow(sample);

另一种方法是使用singleton pattern 创建一个类,您可以将链表放在其中。如果它位于一个公共位置,您就可以从两个窗口访问它。

【讨论】:

  • 你不应该通过引用传递它,它已经是一个引用类型。这样做的唯一目的是,如果您想实际将链表重新分配给新链表。
猜你喜欢
  • 2018-12-28
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2020-10-31
  • 2016-04-29
相关资源
最近更新 更多