1.错误代码
类A:
public List<List<Int32>> datalist = new List<List<Int32>>();//存储读出来的数据
类B
MainForm3 mainForm3 = new MainForm3();
int length = mainForm3.datalist[0].Count();
length的值一直是0,明明读出数据来了,就是没有传到类B中
2.正确代码
public static List<List<Int32>> datalist = new List<List<Int32>>();//存储读出来的数据
MainForm3 mainForm3 = new MainForm3();
int length = MainForm3.datalist[0].Count();
3.解决思路
类B在实例化之后,此时的B与A已经不是同一个对象了,B中所有的内容包括那个datalist都会初始化(如果你的构造函数中也没有处理list)那count自然就是0
4.静态类和静态类成员
参考:静态类和静态类成员 - C# 编程指南 | Microsoft Docs
静态类基本上与非静态类相同,但存在一个差异:静态类无法实例化。 换句话说,无法使用 new 运算符创建类类型的变量。 由于不存在任何实例变量,因此可以使用类名本身访问静态类的成员。
静态类可以用作只对输入参数进行操作并且不必获取或设置任何内部实例字段的方法集的方便容器。 例如,在 .NET 类库中,静态 System.Math 类包含执行数学运算,而无需存储或检索对 Math 类特定实例唯一的数据的方法。 即,通过指定类名和方法名称来应用类的成员,如下面的示例所示。
double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));
// Output:
// 3.14
// -4
// 3
创建静态类基本上与创建只包含静态成员和私有构造函数的类相同。 私有构造函数可防止类进行实例化。 使用静态类的优点是编译器可以进行检查,以确保不会意外地添加任何实例成员。 编译器可保证无法创建此类的实例。
静态类会进行密封,因此不能继承。 它们不能继承自任何类(除了 Object)。 静态类不能包含实例构造函数。 但是,它们可以包含静态构造函数。 如果非静态类包含了需要进行有意义的初始化的静态成员,则它也应该定义一个静态构造器。
C# 不支持静态局部变量(即在方法范围中声明的变量)。
可在成员的返回类型之前使用 static
关键字声明静态类成员,如下面的示例所示:
public class Automobile
{
public static int NumberOfWheels = 4;
public static int SizeOfGasTank
{
get
{
return 15;
}
}
public static void Drive() { }
public static event EventType RunOutOfGas;
// Other non-static fields and properties...
}
在首次访问静态成员之前以及在调用构造函数(如果有)之前,会初始化静态成员。 若要访问静态类成员,请使用类的名称(而不是变量名称)指定成员的位置,如下面的示例所示:
C#复制
Automobile.Drive();
int i = Automobile.NumberOfWheels;
如果类包含静态字段,则提供在类加载时初始化它们的静态构造函数。
对静态方法的调用会采用 Microsoft 中间语言 (MSIL) 生成调用指令,而对实例方法的调用会生成 callvirt
指令,该指令还会检查是否存在 null 对象引用。 但是在大多数时候,两者之间的性能差异并不显著。