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

C# 委派實戰:多輸出策略與 WinForms 完整範例

     編輯:關於C語言

情境:數字處理結果輸出到多種目標

需求:將 0~99 的數字分別輸出到 Console、ListBox、文字檔,並支援組合輸出。

1. 定義委派與處理器


public delegate void ShowNumberDel(object[] items);

public class ProcessNumber
{
    private readonly object[] _items;
    public ProcessNumber(int max)
    {
        _items = new object[max];
        for (int i = 0; i < max; i++) _items[i] = i;
    }
    public void ProcessItems(ShowNumberDel show) => show(_items);
}

2. 表單程式碼完整實作


public partial class Form1 : Form
{
    private readonly ProcessNumber _pn = new ProcessNumber(100);
    private ShowNumberDel _del;

    public Form1() => InitializeComponent();

    // 三種具體輸出方法
    private void ShowInConsole(object[] items)
    {
        foreach (var item in items) Console.WriteLine(item);
    }
    private void ShowInListBox(object[] items)
    {
        listBox1.Items.Clear();
        foreach (var item in items) listBox1.Items.Add(item);
    }
    private void ShowInFile(object[] items)
    {
        using var sw = new StreamWriter("Test.txt", true);
        foreach (var item in items) sw.WriteLine(item);
    }

    // 單一輸出按鈕
    private void btnConsole_Click(object sender, EventArgs e) =>
        _pn.ProcessItems(new ShowNumberDel(ShowInConsole));
    private void btnListBox_Click(object sender, EventArgs e) =>
        _pn.ProcessItems(new ShowNumberDel(ShowInListBox));
    private void btnFile_Click(object sender, EventArgs e) =>
        _pn.ProcessItems(new ShowNumberDel(ShowInFile));

    // 組合輸出:多播委派
    private void btnCombo_Click(object sender, EventArgs e)
    {
        _del = null;
        _del += new ShowNumberDel(ShowInListBox);
        _del += new ShowNumberDel(ShowInFile);
        _pn.ProcessItems(_del);
    }
}

3. 介面佈局

WinForms 介面示意圖

4. 關鍵觀念複習

  • _del += ... 組合多播委派,呼叫時依序執行所有目標
  • 若任一目標拋出例外,後續目標不會執行(需自行 try/catch 包裝)
  • 委派實例不可變,+= 實際產生新實例
  • 此模式即策略模式的委派實作版本
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved