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#教程。
