class 和命名空间内的 C# 列表,从另一个 class 访问它
C# List inside class and namespace, accessing it from another class
请原谅我对C#的了解不多,因为这个问题对你们中的一些人来说可能很容易,但我无法理解它。
我尝试并搜索了很多示例和教程,但它们都只是部分示例,所以我无法正确理解。
我有这个class "FilesDataStruct":
namespace MYPROJECT.FilesListData
{
class FilesDataStruct
{
public int ID;
public string Name;
}
}
和class "FilesDataClass":
namespace MYPROJECT.FilesListData
{
class FilesDataClass
{
public List<FilesDataStruct> Files;
public FilesDataClass()
{
Files = new List<FilesDataStruct>();
}
}
}
他们使用的命名空间是“FilesListData”。
所以我转到 Class“B”在 MYPROJECT 并声明:
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”class(或任何其他 ..)中访问此列表:
所以我再次声明:
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”时它都会变成一个新的空 class...
请向我解释我究竟做错了什么,以及我应该如何访问我的 class 以检索我想要的任何 class 中的项目...
你需要制作 B.m_ListWorker public(或者更好,public 属性)。然后你可以访问它作为 someInstanceOfB.ListWorker 如果它是实例 属性 或 B.ListWorker 如果它是静态的。
您需要传递对现有 class 的引用,而不是创建它的新实例。
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);
}
在循环中实例化 class:
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#的了解不多,因为这个问题对你们中的一些人来说可能很容易,但我无法理解它。
我尝试并搜索了很多示例和教程,但它们都只是部分示例,所以我无法正确理解。
我有这个class "FilesDataStruct":
namespace MYPROJECT.FilesListData
{
class FilesDataStruct
{
public int ID;
public string Name;
}
}
和class "FilesDataClass":
namespace MYPROJECT.FilesListData
{
class FilesDataClass
{
public List<FilesDataStruct> Files;
public FilesDataClass()
{
Files = new List<FilesDataStruct>();
}
}
}
他们使用的命名空间是“FilesListData”。
所以我转到 Class“B”在 MYPROJECT 并声明:
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”class(或任何其他 ..)中访问此列表:
所以我再次声明:
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”时它都会变成一个新的空 class...
请向我解释我究竟做错了什么,以及我应该如何访问我的 class 以检索我想要的任何 class 中的项目...
你需要制作 B.m_ListWorker public(或者更好,public 属性)。然后你可以访问它作为 someInstanceOfB.ListWorker 如果它是实例 属性 或 B.ListWorker 如果它是静态的。
您需要传递对现有 class 的引用,而不是创建它的新实例。
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);
}
在循环中实例化 class:
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);
}