ZetCode

C# Object.ToString

最后修改于 2023 年 7 月 5 日

C# Object.ToString 教程展示了如何在 C# 中使用 Object.ToString 方法。

Object.ToString 返回表示当前对象的字符串。 它是 .NET 中的主要格式化方法。 该方法的默认实现返回对象类型的完全限定名。

将对象传递给 Console.WriteLine 方法时,会调用 Object.ToString 方法。

将类型转换为字符串时存在多个挑战。 例如,字符串输出可能是特定于文化的,如日期和时间所示。 或者类型的内部实现与用户期望的格式不同。

自定义类型通常会重写 Object.ToString 方法的默认实现。 此外,可以重载该方法。 为了获得最大的灵活性,我们还可以提供自己的格式化器对象。

C# 默认 ToString

默认的 ToString 方法返回类型的完全限定名。

Program.cs
var u1 = new User("John Doe", "gardener");
var u2 = new User("Roger Roe", "driver");

Console.WriteLine(u1);
Console.WriteLine(u2);

class User 
{
    private string Name {get; set; }
    private string Occupation {get; set;}

    public User(string Name, string Occupation) =>
        (this.Name, this.Occupation) = (Name, Occupation);
}

我们有一个 User 类,它没有重写 ToString 方法;它使用其父类的默认方法。

Console.WriteLine(u1);

当我们把对象传递给 Console.WriteLine 方法时,ToString 方法会被调用。

$ dotnet run 
User
User

C# 重写 ToString

在下一个示例中,我们将重写 ToString 方法。

Program.cs
var u1 = new User("John Doe", "gardener");
var u2 = new User("Roger Roe", "driver");

Console.WriteLine(u1);
Console.WriteLine(u2);

class User 
{
    private string Name {get; set; }
    private string Occupation {get; set;}

    public User(string Name, string Occupation) =>
        (this.Name, this.Occupation) = (Name, Occupation);

    public override string ToString()
    {
        return $"User {{ {Name} {Occupation} }}";
    }
}

重写的 ToString 方法返回用户的姓名和职业,从而提供更有意义的输出。

$ dotnet run
User { John Doe gardener }
User { Roger Roe driver }

C# record ToString

record 类型提供了 ToString 方法的默认实现,其中包含有关对象属性的附加信息。

Program.cs
var u1 = new User("John Doe", "gardener");
var u2 = new User("Roger Roe", "driver");

Console.WriteLine(u1);
Console.WriteLine(u2);

record User(string Name, string Occupation);

在此示例中,我们使用 record 而不是 class

$ dotnet run
User { Name = John Doe, Occupation = gardener }
User { Name = Roger Roe, Occupation = driver }

C# DateTime ToString

格式化日期时间数据很复杂; 不仅多种文化对于显示日期和时间有不同的标准,而且每种文化对于显示日期和时间可能有多种方式。

DateTime 时间具有默认的 ToString 方法和一些附加的内置格式方法。 此外,它还允许提供我们自己的格式。

Program.cs
using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;

var d1 = DateTime.Now;
Console.WriteLine(d1);

string fmt = "MMMM dd, yyyy (dddd)";

var d2 = new DateTime(2020, 5, 20);
Console.WriteLine(d2.ToString(fmt));

var d3 = new DateTime(2021, 3, 30);
Console.WriteLine(d3.ToShortDateString());

DateTime now = DateTime.Now;
CultureInfo ci = new CultureInfo("sk-SK");
Console.WriteLine($"Dnešný dátum a čas: {now.ToString("F", ci)}");

在此示例中,我们使用默认的 DateTime 格式化程序、自定义格式化程序、内置格式化程序和特定于文化的格式化程序。

$ dotnet run
4/8/2021 1:14:43 PM
May 20, 2020 (Wednesday)
3/30/2021
Dnešný dátum a čas: štvrtok 8. apríla 2021 13:14:43

C# ToString 带货币数据

格式化货币数据也很复杂。 各个国家/地区使用不同的十进制分隔符和货币符号。 此外,货币符号可以放在值的前面或后面。

Program.cs
using System.Globalization;

decimal val = 766.45m;

Console.WriteLine(val.ToString("C3", new CultureInfo("en-US")));
Console.WriteLine(val.ToString("C3", new CultureInfo("fr-FR")));
Console.WriteLine(val.ToString("C3", new CultureInfo("zh-CN")));
Console.WriteLine(val.ToString("C3", new CultureInfo("sk-SK")));
Console.WriteLine(val.ToString("C3", new CultureInfo("ja-JP")));

该示例将 C3 货币说明符与五种不同的文化一起使用。

$ dotnet run
$766.450
766,450 €
¥766.450
766,450 €
¥766.450

C# 重载 ToString

在以下示例中,我们将重载 ToString 方法。

Program.cs
var t1 = new Temperature(0m);
Console.WriteLine(t1.ToString());
Console.WriteLine(t1.ToString(Temperature.Scale.Celsius));
Console.WriteLine(t1.ToString(Temperature.Scale.Kelvin));
Console.WriteLine(t1.ToString(Temperature.Scale.Fahrenheit));

Console.WriteLine("--------------------");

var t2 = new Temperature(-20m);
Console.WriteLine(t2.ToString());
Console.WriteLine(t2.ToString(Temperature.Scale.Celsius));
Console.WriteLine(t2.ToString(Temperature.Scale.Kelvin));
Console.WriteLine(t2.ToString(Temperature.Scale.Fahrenheit));

Console.WriteLine("--------------------");

var t3 = new Temperature(32m);
Console.WriteLine(t3.ToString());
Console.WriteLine(t3.ToString(Temperature.Scale.Celsius));
Console.WriteLine(t3.ToString(Temperature.Scale.Kelvin));
Console.WriteLine(t3.ToString(Temperature.Scale.Fahrenheit));

class Temperature
{
    private decimal temp;

    public Temperature(decimal temp)
    {
        this.temp = temp;
    }

    public decimal Celsius
    {
        get { return this.temp; }
    }

    public decimal Kelvin
    {
        get { return this.temp + 273.15m; }
    }

    public decimal Fahrenheit
    {
        get { return Math.Round(((decimal)(this.temp * 9 / 5 + 32)), 2); }
    }

    public override string ToString()
    {
        return this.ToString(Scale.Celsius);
    }

    public string ToString(Scale scale)
    {
        var res = scale switch
        {
            Scale.Celsius => this.Celsius.ToString("N2") + " °C",
            Scale.Fahrenheit => this.Fahrenheit.ToString("N2") + " °F",
            Scale.Kelvin => this.Kelvin.ToString("N2") + " K",
            _ => throw new FormatException($"Unsupported scale: '{scale}'")
        };

        return res;
    }

    internal enum Scale
    {
        Celsius,
        Kelvin,
        Fahrenheit
    }
}

我们有一个 Temperature 类型。 它可以以摄氏度、华氏度或开尔文刻度表示。 我们有一个重载的 ToString 方法,该方法根据提供的刻度格式化温度。

public override string ToString()
{
    return this.ToString(Scale.Celsius);
}

override 方法调用第二个方法,并将其传递给 Scale.Celsius

var res = scale switch
{
    Scale.Celsius => this.Celsius.ToString("N2") + " °C",
    Scale.Fahrenheit => this.Fahrenheit.ToString("N2") + " °F",
    Scale.Kelvin => this.Kelvin.ToString("N2") + " K",
    _ => throw new FormatException($"Unsupported scale: '{scale}'")
};

switch 表达式用于根据给定的刻度格式化温度值。

$ dotnet run
0.00 °C
0.00 °C
273.15 K
32.00 °F
--------------------
-20.00 °C
-20.00 °C
253.15 K
-4.00 °F
--------------------
32.00 °C
32.00 °C
305.15 K
89.60 °F

来源

Object.ToString 方法

在本文中,我们研究了 C# 中的 Object.ToString 方法。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程