委託的學習以及使用

每個人都委託都有不同的見解,因爲看問題的角度不同。個人認爲,可以從以下2點來理解:
(1) 從數據結構來講,委託是和類一樣是一種用戶自定義類型。
(2) 從設計模式來講,委託(類)提供了方法(對象)的抽象。
既然委託是一種類型,那麼它存儲的是什麼數據?
我們知道,委託是方法的抽象,它存儲的就是一系列具有相同簽名和返回回類型的方法的地址。調用委託的時候,委託包含的所有方法將被執行。
2. 委託類型的定義
委託是類型,就好像類是類型一樣。與類一樣,委託類型必須在被用來創建變量以及類型對象之前聲明。
//接下來我們就簡單的寫幾個例子
class Program
{
delegate void Delegate1();//定義一個委託
static void Main(string[] args)
{

            **//聲明委託對象**
            Delegate1 dele1;
            //無參無返回值類型的
            //方法一:
            Student stu = new Student();
             **//給委託綁定方法,也就是讓委託持有方法**
            dele1 = stu.ShouName;//讓這個委託持有學生類的顯示名字的方法
            dele1 += stu.ShouAge;//給委託綁定又綁定了一個方法
            dele1.Invoke();//方法調用
           //方法二
           Task1(stu.ShouAge);

        }
   static void Task1(Delegate1 dele)
    {
        dele.Invoke();
    }
    class Student
    {

        public void ShouName()
        {

            Console.WriteLine("張三");
        }

        public void ShouAge()
        {

            Console.WriteLine(18);
        }
    }

}

//有參數有返回值類型的
方法一
class Program
{
delegate int Delegate1(int a,int b);//定義委託
static void Main(string[] args)
{
////聲明一個委託對象
//Delegate1 delegate1;
////給委託綁定方法,讓委託持有方法
delegate1 = Tools.Sub;
int result = delegate1(3,5);
Console.WriteLine(result);

}
class Tools
{
    public static int Add(int a,int b)
    {
        return a + b;
    }
    public static int Sub(int a, int b)
    {
        return a - b;
    }
}
方法二
   class Program
{
    delegate int Delegate1(int a,int b);//定義委託
    static void Main(string[] args)
    {
        ////聲明一個委託對象
        //Delegate1 delegate1;
        ////給委託綁定方法,讓委託持有方法
     int result= MyInvoke(Tools.Add,5,5)
         Console.WriteLine(result);
}
     static int MyInvoke(Delegate1 delegate1,int a,int b)
    {
        int result = delegate1.Invoke(a,b);
        return result;
    }

class Tools
{
    public static int Add(int a,int b)
    {
        return a + b;
    }
    public static int Sub(int a, int b)
    {
        return a - b;
    }
}

//泛型委託
//1.我們自己定義一個
// delegate void MyDelegate();
//寫一個學生類並添加方法
//class Student
//{
// public void Tast()
// {
// Console.WriteLine(12356);
// }
//}
//主程序調用
//MyDelegate dele =
// new MyDelegate(new Student().Tast
// );
//dele.Invoke();
//2. 我們也可以用Action調用,這時候就不用定義委託了
//直接用學生類
//class Student
//{
// public void Tast()
// {
// Console.WriteLine(12356);
// }
//}
//在主程序調用
// Student s = new Student();
//開始委託
//Action action = s.Tast;//如果Tast沒有參數 Action不加<>,如果Tast有參數,則需加<>例如Tast(int num),則 Action;
//3.用Func委託 func類型必須是有參數和返回值類型的
例如Func< int,string,int> <>裏最後的參數是方法返回的類型,前幾個對應方法參數類型
class Student
{
public int Tast(int num)
{
return num;
}
}
Func< int,int > func = s.Tast;
// int num= func(5);//這麼調用,然後輸出
//Console.WriteLine(num)
//或者直接輸出
Console.WriteLine(func.Invoke(5));

//用lambda表達式或者匿名方法
//public delegate void MyDelegate(string name);
//把委託定義到類的外部
public class PersonManager
{
//事件定義到類的內部,用來封裝,定義事件的關鍵字 event,用委託來聲明事件
public event Action MyEvent**;
public event Action MyEventint;
//觸發事件的方法
public void Exec( string name,int age = 18)
{
if (age!=18)
{
MyEvent.Invoke(name);
MyEventint.Invoke(age);
}else
{
MyEvent.Invoke(name);
}

        }


    }

static void Main(string[] args)
{
PersonManager personManager = new PersonManager();

//使用匿名方法綁定事件的處理,訂閱事件
personManager.MyEvent += delegate (string name) {
Console.WriteLine(“My name is ” + name);
};
//使用lambda表達式
personManager.MyEventint += (int age) =>
{
Console.WriteLine(“我的年齡是:”+age);
};

 //執行事件,若Age是18 執行名字和年齡
 //若不是18 只有名字
 personManager.Exec("張三",20);
    }
}
//使用匿名函數與fUNC

//匿名函數 a 是 第一個double 的形參,condition 是第二個bool類型的形參
Func< double, bool, double> func = (a, condition) =>
{
if (condition)
{
return a * 1.5;
}
else
{
return a * 2;
}
};
double result = func(1000, false);
Console.WriteLine(“Result is : ” + result);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章