首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 5:永遠提供 ToString()(中)

     編輯:關於C語言

為何要覆寫 ToString()

  • 除錯視窗顯示:Visual Studio 監看式、即時運算視窗呼叫 ToString()
  • UI 控制項繫結: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  ← 無資訊!

最小實作:三行解決 90% 需求

public override string ToString() => Name; // 或 $"{Name} ({Id})"

立即獲得:除錯可讀、UI 正確顯示、日誌有意義。

進階需求:IFormattable 介面

當單一 ToString() 不夠用(如報表需姓名+營收、匯出需電話+地址),實作 IFormattable:

string IFormattable.ToString(string format, IFormatProvider formatProvider)
{
    // format 範例:"N"=姓名, "R"=營收, "P"=電話, "NR"=姓名+營收...
}

格式字串設計原則

  • 單一字母:N、R、P
  • 組合:NR、NP、NPR(順序代表欄位順序)
  • 支援 "G"、""、null → 等同 ToString()
  • 大小寫不敏感

實作範例:Customer 類別

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
        };
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved