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 @   弹吉他的小刘鸭  阅读(609)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示