Menu
CoddyTech

重写 ToString()

本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 38 课,共 70 课。

C# 中的每个类都继承自 object,它提供了 ToString() 方法。默认情况下,它会返回完全限定的类型名称。当你想查看对象的实际数据时,这并不太有用。

你可以重写 ToString(),让它返回对象有意义的字符串表示:

public class Person
{
    public string Name { get; }
    public int Age { get; }
    
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    
    public override string ToString()
    {
        return $"{Name} ({Age} years old)";
    }
}

现在,打印或拼接一个 Person 对象时,你会得到可读的输出:

Person p = new Person("Alice", 30);
Console.WriteLine(p);  // Alice(30 岁)

如果没有重写,这会打印出类似 MyNamespace.Person 的内容。你需要使用 override 关键字,因为你正在替换从 object 继承的方法。这在调试和日志记录时特别有用,因为你需要快速了解对象的状态。

challenge icon

挑战

简单

让我们来创建一个 Book 类,让打印对象时显示有意义的字符串表示形式,这样调试和展示图书信息都会直观得多。

你需要将代码分成两个文件:

  • Book.cs:在 Library 命名空间中创建一个 Book 类,用来表示一本包含基本信息的图书。这个类应包含:
    • 三个只读属性:Title(字符串)、Author(字符串)和 Year(整数)
    • 一个按 title、author、year 的顺序接收参数的构造函数
    • 一个重写的 ToString() 方法,返回格式化后的字符串:"{Title}" by {Author} ({Year})
    注意,输出中的书名需要用双引号括起来!
  • Program.cs:在主文件中,使用输入值创建一个 Book 对象,并直接打印它。得益于你重写的 ToString() 方法,将图书对象传给 Console.WriteLine() 时,会自动显示格式化后的信息,而不是类型名称。

你会收到三个输入:

  • 图书标题(字符串)
  • 作者姓名(字符串)
  • 出版年份(整数)

使用 Console.WriteLine() 直接打印图书对象。

例如,如果输入是 The Great Gatsby、F. Scott Fitzgerald 和 1925,输出应为:

"The Great Gatsby" by F. Scott Fitzgerald (1925)

这里的巧妙之处在于,你不需要显式调用 ToString()。将对象传给 Console.WriteLine() 时,它会自动调用对象的 ToString() 方法。这样重写后,输出就更有用,而不是只显示 Library.Book!

亲手试试

using System;
using Library;

class Program
{
    public static void Main(string[] args)
    {
        // 读取输入
        string title = Console.ReadLine();
        string author = Console.ReadLine();
        int year = Convert.ToInt32(Console.ReadLine());

        // TODO:使用输入的值创建一个 Book 对象

        // TODO:使用 Console.WriteLine() 直接输出 Book 对象
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C# 在线编译器