C# Object.ToString
最后修改于 2023 年 7 月 5 日
C# Object.ToString 教程展示了如何在 C# 中使用 Object.ToString 方法。
Object.ToString
返回表示当前对象的字符串。 它是 .NET 中的主要格式化方法。 该方法的默认实现返回对象类型的完全限定名。
将对象传递给 Console.WriteLine
方法时,会调用 Object.ToString
方法。
将类型转换为字符串时存在多个挑战。 例如,字符串输出可能是特定于文化的,如日期和时间所示。 或者类型的内部实现与用户期望的格式不同。
自定义类型通常会重写 Object.ToString
方法的默认实现。 此外,可以重载该方法。 为了获得最大的灵活性,我们还可以提供自己的格式化器对象。
C# 默认 ToString
默认的 ToString
方法返回类型的完全限定名。
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
方法。
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
方法的默认实现,其中包含有关对象属性的附加信息。
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
方法和一些附加的内置格式方法。 此外,它还允许提供我们自己的格式。
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 带货币数据
格式化货币数据也很复杂。 各个国家/地区使用不同的十进制分隔符和货币符号。 此外,货币符号可以放在值的前面或后面。
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
方法。
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
来源
在本文中,我们研究了 C# 中的 Object.ToString 方法。
作者
列出所有 C# 教程。