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