【问题标题】:C# List inside class and namespace, accessing it from another class类和命名空间内的 C# 列表,从另一个类访问它
【发布时间】:2017-11-04 11:28:51
【问题描述】:

请原谅我对 C# 的了解很少,因为这个问题对你们中的一些人来说可能很容易,但我无法理解它。

我尝试并搜索了很多示例和教程,但它们都只是部分示例,所以我无法正确理解。

我有这个类“FilesDataStruct”:

namespace MYPROJECT.FilesListData
{
    class FilesDataStruct
    {
        public int ID;
        public string Name;
    }
}

还有“FilesDataClass”类:

namespace MYPROJECT.FilesListData
{
    class FilesDataClass
    {
        public List<FilesDataStruct> Files;

        public FilesDataClass()
        {
            Files = new List<FilesDataStruct>();
        }
    }
}

他们使用的命名空间是“FilesListData”。

所以我去MYPROJECT中的“B”类并声明:

private FilesDataClass m_ListWorker;

然后将项目添加到我的列表中:

m_ListWorker = new FilesDataClass();

FilesDataStruct item = new FilesDataStruct();

for (int i = 0; i < 10; i++)
{
    item.ID = i;
    item.Name = "Just_Testing";

    m_ListWorker.Files.Add(item);
}

调试这个我可以看到项目被正确添加。

现在我需要在“Form1”类(或任何其他..)中访问此列表:

所以我再次声明:

 private FilesDataClass m_ListWorker;

但是阅读我找到的示例和教程,我已经做到了:

m_ListWorker = new FilesDataClass(); // this is weird, if I call the class again it's normal to be empty

for (int i = 0; i < m_ListWorker.Files.Count; i++)
{
    Console.WriteLine(m_ListWorker.Files[i].ID);
    Console.WriteLine(m_ListWorker.Files[i].Name);
}

当然,那里什么也没有。我猜问题出在“FilesDataClass”的构造函数上,因为每次调用“new”都会变成一个新的空类...

请向我解释我到底做错了什么,我应该如何访问我的班级以检索我想要的任何班级中的项目...

【问题讨论】:

  • 你是对的,当调用new FilesDataClass(); 时,你正在创建一个新的类的空对象。您需要以某种方式将旧的 m_ListWorker-object 从 Class B 转移到 Form1。
  • @Basti 是的,它是正确的,但是如何......这就是我问这个问题的原因。
  • 这取决于你的类结构。如果您在 Form1 中初始化 Class B,您可以简单地通过 myClassBInstance.m_ListWorker 访问它

标签: c# c#-4.0 c#-3.0 c#-2.0


【解决方案1】:

您需要传递对现有类的引用,而不是创建它的新实例。

public class Form1 : Form
{
    FilesDataClass m_ListWorker = null;

    public Form1(FilesDataClass f)
    {
        this.m_ListWorker = f;
    }
}

var newForm = new Form1(m_ListWorker);

您还有第二个问题。 for 循环不会像您期望的那样工作。您只需添加相同的 FilesDataStruct 实例 10 次...最后,您有 10 个引用都将具有相同的值(您在循环的最后一次迭代中分配的值)。

m_ListWorker = new FilesDataClass();

FilesDataStruct item = new FilesDataStruct();

for (int i = 0; i < 10; i++)
{
    item.ID = i;
    item.Name = "Just_Testing";

    m_ListWorker.Files.Add(item);
}

改为在循环内实例化类:

m_ListWorker = new FilesDataClass();

for (int i = 0; i < 10; i++)
{
    FilesDataStruct item = new FilesDataStruct();
    item.ID = i;
    item.Name = "Just_Testing";

    m_ListWorker.Files.Add(item);
}

【讨论】:

  • 您的回答为我指明了正确的方向,这在某种程度上与 c++ 相似,但即便如此我也无法将 FilesDataClass f 传递给 Form1...
  • 显然,我需要在 Application.Run(new Form1());否则它不会编译...
  • 我已经通过设置“public static FilesDataClass m_ListWorker;”解决了这个问题然后只是访问它。您的回答为我指明了正确的方向。
  • 也感谢for循环,这是我犯的一个错误T_T
【解决方案2】:

您需要将 B.m_ListWorker 设为公共(或者更好的是,公共属性)。然后,如果它是实例属性,则可以将其作为 someInstanceOfB.ListWorker 访问,如果它是静态的,则可以作为 B.ListWorker 访问。

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多