如何在类中实例化对象数组?解决Web服务交互中的AV问题
解决主类中下级类数组未初始化导致的AV错误问题
嘿,这个问题我之前对接Web服务的时候也踩过坑!核心原因很明确:你实例化主类的时候,ProductLines数组只是一个空引用,根本没有分配实际的内存空间,这时候往里面插入数据自然会触发访问违例(AV)。下面给你两种靠谱的解决思路,尤其是第二种,日常开发里用得更多:
方法1:在主类构造函数中正确初始化数组
你说尝试过构造函数但没解决,大概率是初始化的写法不对。数组是引用类型,必须显式创建实例才能使用,举个例子:
假设你的类结构是这样的:
// 下级类定义 public class ProductLine { public string LineId { get; set; } public string LineDescription { get; set; } // 其他业务字段 } // 主类定义 public class MainProduct { public int ProductId { get; set; } public string ProductName { get; set; } public ProductLine[] ProductLines { get; set; } // 仅声明,未初始化 }
那在主类的构造函数里,你需要给ProductLines分配内存:
public class MainProduct { public int ProductId { get; set; } public string ProductName { get; set; } public ProductLine[] ProductLines { get; set; } public MainProduct() { // 方案A:如果知道预估的元素数量,直接指定数组长度 // ProductLines = new ProductLine[3]; // 方案B:先初始化空数组,后续用Array.Resize扩容 ProductLines = new ProductLine[0]; } }
之后插入数据时,需要先扩容数组再赋值:
// 实例化主类 var myProduct = new MainProduct(); // 创建要插入的ProductLine对象 var newLine = new ProductLine { LineId = "L001", LineDescription = "Premium Series" }; // 扩容数组(长度+1) Array.Resize(ref myProduct.ProductLines, myProduct.ProductLines.Length + 1); // 将新对象放入数组最后一位 myProduct.ProductLines[myProduct.ProductLines.Length - 1] = newLine;
方法2:改用List<ProductLine>代替数组(更推荐)
数组的长度是固定的,插入/删除操作都很繁琐,还容易出错。换成C#的泛型列表List<T>会省心很多——它会自动管理内存扩容,初始化也简单:
修改主类的定义:
public class MainProduct { public int ProductId { get; set; } public string ProductName { get; set; } // 将数组替换为List<ProductLine> public List<ProductLine> ProductLines { get; set; } public MainProduct() { // 构造函数中初始化List ProductLines = new List<ProductLine>(); } }
插入数据直接调用Add方法即可,完全不用操心内存分配:
var myProduct = new MainProduct(); myProduct.ProductLines.Add(new ProductLine { LineId = "L001", LineDescription = "Premium Series" });
为什么之前构造函数没起作用?
很大可能是你在构造函数里只是写了ProductLines;,而没有执行ProductLines = new ProductLine[...];——引用类型必须通过new关键字创建实例,才能获得可操作的内存空间,否则它就是一个指向null的空引用,访问自然会报错。
内容的提问来源于stack exchange,提问作者T18Pilot
相关产品推荐
相关产品推荐

