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#记录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
方法和一些额外的内置格式化方法。此外,它还允许提供我们自己的格式。
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#教程。