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#语言设计的安全性有关,还有待商榷。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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搭建本