开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# 对象.ToString

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

未经允许不得转载:我爱分享网 » C# 对象.ToString

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏