You need to enable JavaScript to run this app. C#中Console.WriteLine输出自定义toy类实例为类名而非属性值
优惠活动
大模型
产品
解决方案
定价
更多

C#中Console.WriteLine输出自定义toy类实例为类名而非属性值

问题根因

你遇到的Program+toy输出结果,本质是C#的默认类型转换逻辑导致的:
当直接将自定义类的实例传入Console.WriteLine()方法时,方法会自动调用对象继承自object基类的默认ToString()实现,这个默认方法没有任何业务逻辑,仅返回当前类的完全限定名称。由于你定义的toy类是嵌套在Program类内部的类型,系统对嵌套类的命名标识就是外层类名+嵌套类名,因此会固定输出Program+toy,完全不会自动读取你类中封装的name、price字段值。

可落地的调整方案

根据你的使用场景,可以选择两种适配新手的修改方式,不需要复杂的语法:

方案1:在toy类中重写ToString()方法(推荐,封装性更好)

在你的toy类内部添加重写逻辑,自定义实例转字符串的格式,后续无论在哪输出toy类实例,都会自动按你定义的格式返回内容,完整示例代码如下:

class toy
{
    // 你已定义的私有字段和配套get/set属性保持不变
    private string name;
    private decimal price;

    public string Name
    {
        get => name;
        set => name = value;
    }
    public decimal Price
    {
        get => price;
        set => price = value;
    }

    // 新增:重写默认的ToString方法,自定义输出格式
    public override string ToString()
    {
        return $"{Name} {Price}";
    }
}

修改后直接传实例给Console.WriteLine()就会输出预期的Car 10、Soldier 15格式内容。

方案2:输出时手动读取属性值(适配临时输出场景)

如果不需要修改类的全局输出逻辑,不要直接把实例传给输出方法,手动通过get属性读取name和price的值拼接输出即可,示例代码:

// 实例化两个toy对象并赋值
toy car = new toy { Name = "Car", Price = 10 };
toy soldier = new toy { Name = "Soldier", Price = 15 };

// 不要直接传实例,手动读取属性值输出
Console.WriteLine($"{car.Name} {car.Price}");
Console.WriteLine($"{soldier.Name} {soldier.Price}");
新手常见踩坑提醒
  • 重写ToString()方法时必须添加override关键字,否则会触发方法隐藏逻辑,无法替换基类的默认实现,达不到自定义输出的效果
  • 按照C#通用编码规范,自定义类名建议使用大驼峰命名法(即把toy调整为Toy),可以和普通变量名形成区分,降低后续维护的认知成本
  • 除非明确有自定义输出的需求,否则不要随意给类重写ToString(),避免其他场景下的输出不符合预期

内容的提问来源于stack exchange,提问作者lnyfrnd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 04:57:03