重写 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 继承的方法。这在调试和日志记录时特别有用,因为你需要快速了解对象的状态。
挑战
简单让我们来创建一个 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 对象
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器