在 C# 中,ToString() 是一个非常基础且常用的方法,所有类型(包括自定义类型)都继承自 object 类的 ToString() 方法,其主要作用是将对象转换为字符串表示形式。

1. 基本用法

  • 默认实现:对于基础数据类型(如 intfloatDateTime 等),ToString() 有默认实现,会返回该类型的常规字符串表示。

    int num = 123;
    string str = num.ToString(); // 结果为 "123"
    
    DateTime dt = new DateTime(2023, 10, 1);
    string dateStr = dt.ToString(); // 结果类似 "2023/10/1 0:00:00"(取决于系统文化)
    
  • 自定义类型:默认情况下,自定义类的 ToString() 会返回类的全名(命名空间 + 类名)。通常需要重写该方法以返回有意义的字符串:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        
        // 重写 ToString()
        public override string ToString()
        {
            return $"{Name}, {Age}岁";
        }
    }
    
    // 使用
    Person p = new Person { Name = "张三", Age = 25 };
    string personStr = p.ToString(); // 结果为 "张三, 25岁"
    

2. 格式化字符串(Format Specifier)

许多基础类型(如数值、日期、枚举等)的 ToString() 支持格式化字符串,用于控制转换后的字符串格式。语法为:

变量.ToString("格式化字符串");

(1)数值类型格式化

  • 标准格式(如 FNC 等):

    • F:固定小数位数(F0 无小数,F2 保留2位小数)
      double num = 123.456;
      Console.WriteLine(num.ToString("F0")); // "123"(四舍五入)
      Console.WriteLine(num.ToString("F2")); // "123.46"
      
    • N:带千位分隔符(可指定小数位数)
      int bigNum = 1234567;
      Console.WriteLine(bigNum.ToString("N0")); // "1,234,567"
      
    • C:货币格式(受系统文化影响)
      decimal money = 123.45m;
      Console.WriteLine(money.ToString("C")); // 中文环境下为 "¥123.45"
      
  • 自定义格式(如 0#. 等):

    • 0:强制占位(位数不足时补0)
    • #:可选占位(位数不足时不显示)
    double num = 12.3;
    Console.WriteLine(num.ToString("000.00")); // "012.30"(补0)
    Console.WriteLine(num.ToString("###.##")); // "12.3"(不补0)
    

(2)日期时间格式化

通过格式化字符串控制日期时间的显示格式:

DateTime dt = new DateTime(2023, 10, 1, 14, 30, 0);

Console.WriteLine(dt.ToString("yyyy-MM-dd")); // "2023-10-01"
Console.WriteLine(dt.ToString("HH:mm:ss"));   // "14:30:00"
Console.WriteLine(dt.ToString("yyyy年MM月dd日 HH:mm")); // "2023年10月01日 14:30"

(3)枚举类型格式化

枚举的 ToString() 可返回枚举值的名称,也可通过格式符返回数值:

enum Status { Success, Error, Pending }

Status s = Status.Success;
Console.WriteLine(s.ToString());      // "Success"(默认返回名称)
Console.WriteLine(s.ToString("D"));   // "0"(返回数值)
Console.WriteLine(s.ToString("X"));   // "00000000"(返回十六进制)

3. 文化相关格式化(IFormatProvider)

ToString() 还有一个重载方法,可指定文化(CultureInfo),用于处理不同地区的格式差异(如数字分隔符、日期格式等):

double num = 1234.56;

// 美国文化(千位分隔符为逗号,小数点为点)
Console.WriteLine(num.ToString("N", CultureInfo.InvariantCulture)); // "1,234.56"

// 德国文化(千位分隔符为点,小数点为逗号)
Console.WriteLine(num.ToString("N", new CultureInfo("de-DE"))); // "1.234,56"

4. 注意事项

  • 空值处理:如果对象为 null,调用 ToString() 会抛出 NullReferenceException,需提前判断:
    object obj = null;
    string str = obj?.ToString() ?? "null"; // 安全处理空值
    
  • 性能:频繁调用 ToString() 可能影响性能(尤其是复杂对象),需合理使用。
  • 自定义格式:对于复杂的格式化需求,建议重写 ToString() 或使用专门的格式化工具类。

总之,ToString() 是类型转换为字符串的核心方法,灵活使用其格式化功能可以满足各种字符串表示需求。