You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类中实例化对象数组?解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:33:12