ToString()ListBox、ComboBox、DataGridView 預設顯示 ToString() 結果Console.WriteLine、String.Format、字串插值 $"{obj}" 皆呼叫 ToString()var list = new List { new Customer("Alice"), new Customer("Bob") };
// ListBox 顯示:MyNamespace.Customer, MyNamespace.Customer ← 無資訊!
public override string ToString() => Name; // 或 $"{Name} ({Id})"
立即獲得:除錯可讀、UI 正確顯示、日誌有意義。
當單一 ToString() 不夠用(如報表需姓名+營收、匯出需電話+地址),實作 IFormattable:
string IFormattable.ToString(string format, IFormatProvider formatProvider)
{
// format 範例:"N"=姓名, "R"=營收, "P"=電話, "NR"=姓名+營收...
}
N、R、PNR、NP、NPR(順序代表欄位順序)"G"、""、null → 等同 ToString()public class Customer : IFormattable
{
public string Name { get; }
public decimal Revenue { get; }
public string ContactPhone { get; }
public override string ToString() => Name;
public string ToString(string format, IFormatProvider formatProvider)
{
// 外部格式化器優先
if (formatProvider?.GetFormat(GetType()) is ICustomFormatter formatter)
return formatter.Format(format, this, formatProvider);
// 內建格式
return format?.ToUpperInvariant() switch
{
"N" => Name,
"R" => Revenue.ToString("C"),
"P" => ContactPhone,
"NR" => $"{Name,20}, {Revenue,10:C}",
"NP" => $"{Name,20}, {ContactPhone,15}",
"PR" => $"{ContactPhone,15}, {Revenue,10:C}",
"NPR" => $"{Name,20}, {ContactPhone,15}, {Revenue,10:C}",
"G" or "" or null => Name,
_ => Name
};
}
}