程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#高級(八)委托

C#高級(八)委托

編輯:關於C#

一、委托

當我們需要把方法做為參數傳遞給其他方法的時候,就需要使用委托。

因為有時候,我們要操作的對象,不是針對數據進行的,而是針對某個方法進行的操作。

我們還是來以代碼入手

using System;
namespace gosoa.com.cn
{
   public class test
   {
     public delegate string GetAString();
     public static void Main()
     {
       int x=10;
       GetAString firstString=new GetAString(x.ToString);
       Console.WriteLine(firstString());
       //上句和下面這句類似。
       //Console.WriteLine(x.ToString());
     }
   }
}

在上例中,public delegate string GetAString(); 就是聲明了一個委托(delegate),其語法和方法 的定義類似,只是沒有方法體,前面要加上關鍵字 delegate 。定義一個委托,基本上是定義一個新類, 所以,可以在任何定義類的地方,定義委托。

注意,在C#中,委托總是自帶一個有參數的構造函數,這就是為什麼在上例中,GetAString firstString=new GetAString(x.ToString); 通過這句初始化一個新的delegate的時候,給傳遞了一個 x.ToString 方法。但,在定義delegate的時候,卻沒有定義參數。

在看另一個例子之前,我們先來了解下匿名方法。

匿名方法的使用,我們看個例子

using System;
namespace gosoa.com.cn
{
   public class test
   {
     delegate string GetUrl(string val);
     static void Main(string [] args)
     {
       string domin="www.gosoa.com.cn";
       GetUrl url=delegate(string param)
       {
         param="http://"+param;
         return param;
       };
       Console.WriteLine(url(domin));
     }
   }
}

在本例中,GetUrl url=delegate(string param) 在這裡實例化一個delegate的時候,采用了匿名的 方法。本例輸出的結果是 http://www.gosoa.com.cn

接下來我們再看一個委托的例子。

using System;
namespace gosoa.com.cn
{
   class NumberOpthion
   {
     public static double numOne(double x)
     {
       return x*2;
     }
     public static double numTwo(double x)
     {
       return x*x;
     }
   }

   public class delegateTest
   {

     delegate double DoubleOpration(double x);
     static void printNumber(DoubleOpration dp,double x)
     {
       double result=dp(x);
       Console.WriteLine(
         "value is {0}, result of DoubleOpration is {1}:",x,result
       );
     }

     static void Main()
     {
       DoubleOpration doption =new DoubleOpration(NumberOpthion.numOne);
       printNumber(doption,1.5);
       doption =new DoubleOpration(NumberOpthion. numTwo);
       printNumber(doption,3.2);

     }
   }
}

首先我們定義了一個NumberOpthion類。用來對數字進行*2和2次方運算。接著,我們定義了一個委托 delegate double DoubleOpration(double x)。下面,我們定義了printNumber(DoubleOpration dp,double x) 這樣一個方法,其中一個參數就是委托。最後我們DoubleOpration doption =new DoubleOpration(NumberOpthion.numOne);實例化了一個委托,並調用了 printNumber 方法。最後的輸出 結果是

Value is 0.5 result of DoubleOpration is 3;

Value is 3.2 result of DoubleOpration is 10.24;

在上例中,我們如果采用匿名方法,代碼就會如下:

using System;
namespace gosoa.com.cn
{
   public class delegateTest
   {
     delegate double DoubleOpration(double x);
     static void printNumber(DoubleOpration dp,double x)
     {
       double result=dp(x);
       Console.WriteLine(
         "value is {0}, result of DoubleOpration is {1}:",x,result
       );
     }
     static void Main()
     {
       DoubleOpration doptionOne =delegate(double x){return x*2;};
       DoubleOpration doptionTwo =delegate(double x){return x*x;};
       printNumber(doptionOne,1.5);
       printNumber(doptionTwo,3.2);
     }
   }
}

委托,還有一種情況,是多播委托。這個在以後我們應用到的時候,會學習到。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved