C#创建数组对象报错
之前是用C++的,对C#语言不熟悉,今天居然创建个对象的数组,对数组赋值的时候出错了
new class array NullReferenceException: Object reference not set to an instance of an object
在此记录一下,加深印象。
为了实现上述操作,在C++里我是这么写的:
#include<iostream>
class A
{
public:
int a;
};
int main()
{
A *array = new A[2];
array[0].a = 1;
array[1].a = 2;
std::cout << array[0].a << std::endl;//没有任何问题,可以正常输出
std::cout << array[1].a << std::endl;
delete array;
std::cin.get();
}
但是我转到C#这样写就不可以了:
class Program
{
public class MyClass
{
public int a;
}
public struct MyStruct
{
public int a;
}
public static void NewAClassObj()
{
MyClass[] myClass = new MyClass[2];
myClass[0].a = 1;
}
public static void NewAStructObj()
{
MyStruct[] myStruct = new MyStruct[2];
myStruct[0].a = 1;
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
NewAStructObj();//struct类型没问题
NewAClassObj();//class类型会报错
Console.ReadLine();
}
}
结果class类型运行会出错,如下图所示:
提示
查阅资料后发现,在C#中,对于语句MyClass[] myClass = new MyClass[2]
,这一语句只是new了这个数组对象,但是具体数组对象里的内容,还需要再去new一下。
所以这里应该改成
public static void NewAClassObj()
{
MyClass[] myClass = new MyClass[2];
for(int i = 0; i < myClass.Length; i++)
myClass[i] = new MyClass[];//需要初始化
myClass[0].a = 1;
}
也可以写个泛型:
T[] InitializeArray<T>(int length) where T : new()
{
T[] array = new T[length];
for (int i = 0; i < length; ++i)
{
array[i] = new T();
}
return array;
}
//之后可以这么写
MyClass[] myClass = InitializeArray<MyClass>(2);
具体C#为什么跟C++不一样,我还不是很清楚,是否跟C#语言设计的安全性有关,还有待商榷。