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#语言设计的安全性有关,还有待商榷。

posted @ 2020-02-24 23:11  弹吉他的小刘鸭  阅读(600)  评论(0编辑  收藏  举报