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
相关产品推荐
相关产品推荐

