1. 程式人生 > >C#之委託

C#之委託

-------------------------      關於委託的一些事兒   -------------------------------------

委託 delegate是隻有一個函式的特殊的類,委託物件的引用相當函式指標。

委託宣告定義一種型別,它用一組特定的引數以及返回型別封裝方法。對於靜態方法,委託物件封裝要呼叫的方法。

對於例項方法,委託物件同時封裝一個例項和該例項上的一個方法。如果您有一個委託物件和一組適當的引數,則可以用這些引數呼叫該委託。

委託的一個有趣且有用的屬性是,它不知道或不關心自己引用的物件的類。任何物件都可以;

只是方法的引數型別和返回型別必須與委託的引數型別和返回型別相匹配。

使用委託使程式設計師可以將方法引用封裝在委託物件內。然後可以將該委託物件傳遞給某個方法,而不必在編譯時知道將呼叫哪個方法。

與 C 或 C++ 中的函式指標不同,委託是面向物件、型別安全的。

-----------------------------------------------------------------------------

下面說說委託的使用步驟:


看個示例啦,先看看結果:


當點選啟動按鈕,倆進度條將自動充滿。

原始碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace _001_C_委託機制
{
    public partial class Form1 : Form
    {

        /// ---定義委託
        delegate void SetProgressBarValueDelegate(int iValue);

       /// ---宣告委託
        SetProgressBarValueDelegate setProgressBarValue;

        public Form1()
        {
            InitializeComponent();
        }

        ///---啟動按鈕事件
        private void button1_Click(object sender, EventArgs e)
        {
            setProgressBarValue = new SetProgressBarValueDelegate(SetprogressBarValue1);
            setProgressBarValueMethod(setProgressBarValue);

            setProgressBarValue = new SetProgressBarValueDelegate(SetprogressBarValue2);
            setProgressBarValueMethod(setProgressBarValue);
        }
        ///---建立呼叫委託的方法
        private void setProgressBarValueMethod(SetProgressBarValueDelegate setValue)
        {
            for (int i = 0; i <= 100; i++)
            {
                ///---將控制權交還給使用者。
                Application.DoEvents();
                ///--執行緒睡眠
                Thread.Sleep(20);
                ///--設定值
                setValue(i);
            }
        }

        /// ---委託呼叫方法
        private void SetprogressBarValue1(int iValue)
        {
            progressBar1.Value = iValue;
        }

        private void SetprogressBarValue2(int iValue)
        {
            progressBar2.Value = iValue;
        }
    }
}
提示,我使用了Threading.Sleep(20); 這裡要加上名稱空間:
using System.Threading;