亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#委托詳解和和示例分享

2020-01-24 02:44:26
字體:
來源:轉載
供稿:網友
什么是委托?

委托是尋址方法的.NET版本,使用委托可以將方法作為參數進行傳遞。委托是一種特殊類型的對象,其特殊之處在于委托中包含的只是一個活多個方法的地址,而不是數據。

委托雖然看起來像是一種類型,但其實定義一個委托,是定義了一個新的類。下面這行代碼,定義了一個委托,使用ILDasm.exe查看其生成的IL代碼如圖所示:

復制代碼 代碼如下:

//定義委托,它定義了可以代表的方法的類型,但其本身卻是一個類
 public delegate int methodDelegate(string str);

032101

由圖中紅色框線中可以看出,.NET將委托定義為一個密封類,派生自基類System.MulticastDelegate,并繼承了基類的三個方法(稍后討論這三個)。

委托與函數指針的區別

1、安全性:C/C++的函數指針只是提取了函數的地址,并作為一個參數傳遞它,沒有類型安全性,可以把任何函數傳遞給需要函數指針的地方;而.NET中的委托是類型安全的。

2、與實例的關聯性:在面向對象編程中,幾乎沒有方法是孤立存在的,而是在調用方法前通常需要與類實例相關聯。委托可以獲取到類實例中的信息,從而實現與實例的關聯。

3、本質上函數指針是一個指針變量,分配在棧中;委托類型聲明的是一個類,實例化為一個對象,分配在堆中。

4、委托可以指向不同類中具有相同參數和簽名的函數,函數指針則不可以。

復制代碼 代碼如下:

namespace ConsoleApplication1
{
    //定義委托,它定義了可以代表的方法的類型,但其本身卻是一個類
    public delegate void methodDelegate(string str);
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            Teacher teacher = new Teacher("王老師");
            methodDelegate methodDelegate1 = new methodDelegate(student.getStudentName);
            methodDelegate1 += teacher.getTeacherName; //可以指向不同類中的方法!
            //methodDelegate1 += teacher.getClassName; 指向簽名不符的方法時提示錯誤!
            methodDelegate1.Invoke("張三");
            Console.ReadLine();
        }
    }

    class Student
    {
        private String name = "";
        public Student (String _name)
        {
            this.name = _name ;
        }
        public Student() {}
        public void getStudentName(String _name)
        {
            if (this.name != "" )
                Console.WriteLine("Student's name is {0}", this.name);
            else
                Console.WriteLine("Student's name is {0}", _name);
        }
    }

    class Teacher
    {
        private String name;
        public Teacher(String _name)
        {
            this.name = _name;
        }
        public void getTeacherName(String _name)
        {
            if (this.name != "")
                Console.WriteLine("Teacher's name is {0}", this.name);
            else
                Console.WriteLine("Teacher's name is {0}", _name);
        }
        public string getClassName()
        {
            return "Eanlish";
        }
    }
}

上述測試代碼運行結果如下:

當指向簽名不符的方法時會提示如下錯誤,證實了委托的安全性。

下面來看看C#中實現委托有哪些方式及各自主要適用范圍。

1、常規實現

復制代碼 代碼如下:

private delegate String getAString();
static void Main(String []args)
{
    int temp = 40;
    getAString stringMethod = new getAString(temp.ToString);
    Console.WriteLine("String is {0}", stringMethod());//這里stringMethod()等價于調用temp.ToString();
    Console.ReadLine();
}


這段代碼中,實例化了類型為GetAString的一個委托,并對它進行初始化,使它引用整型變量temp的ToString()方法。在C#中,委托在語法上總是接受一個參數的構造函數,這個參數就是委托引用的方法。上例中stringMethod()等價于使用temp.ToString(),同時也與調用委托類的Invoke()方法完全相同,實際上,如下圖IL代碼中紅色部分所示,C#編譯器會用stringMethod.Invoke()代替stringMethod()。

為了簡便輸入,C#支持只傳送地址的名稱給委托的實例(委托推斷),如下兩行代碼在編譯器看來是一樣的。

復制代碼 代碼如下:

getAString stringMethod = new getAString(temp.ToString);
getAString stringMethod = temp.ToString;

實際上委托的實例可以引用任何類型的任何對象上的實例方法或靜態方法,只要方法的簽名匹配于委托的簽名即可。所以結構體的方法一樣可以傳遞給委托。

2、多播委托
多播委托具有一個帶有鏈接的委托列表,稱為調用列表,在對委托實例進行調用的時候,將按列表中的委托順序進行同步調用。如果委托有返回值,則將列表中最后一個方法的返回值用作整個委托調用的返回值。因此,使用多播委托通常具有void返回類型。

可以使用+=來使委托指向多個方法的地址,但必須是在委托實例化之后才可以使用+=來添加新的方法地址(添加重復的方法地址編譯器不會報錯,但是也不會重復執行),若想移除其中的方法地址可以使用-=來實現(需要至少保留一個,即對于最后一個方法地址的移除不起作用)。以下代碼中下面兩行無論單獨保留哪行,最終的執行結果都是相同的。

復制代碼 代碼如下:

getAString stringMethod = new getAString(temp.ToString);
stringMethod += temp.ToString;
stringMethod -= temp.ToString;
 

3、委托數組

復制代碼 代碼如下:

delegate double Operations(double x);

    class Program
    {
static void Main()
{
    Operations[] operations =
    {
       MathOperations.MultiplyByTwo,
       MathOperations.Square
    };

    for (int i = 0; i < operations.Length; i++)
    {
Console.WriteLine("Using operations[{0}]:", i);
DisplayNumber(operations[i], 2.0);
DisplayNumber(operations[i], 7.94);
Console.ReadLine();
    }
}

static void DisplayNumber(Operations action, double value)
{
    double result = action(value);
    Console.WriteLine(
       "Input Value is {0}, result of operation is {1}", value, result);
}
    }

    struct MathOperations
    {
public static double MultiplyByTwo(double value)
{
    return value * 2;
}

public static double Square(double value)
{
    return value * value;
}
    }

上述代碼中實例化了一個委托數組operations(與處理類的實例相同),該數組的元素初始化為MathOperations類的不同操作,遍歷這個數組,可以將每個操作應用到2個不同的值中。這種用法的好處是,可以在循環中調用不同的方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区久久精品| 在线成人激情黄色| 亚洲四色影视在线观看| 国产视频999| 国产亚洲视频在线| 欧美日韩一区二区三区在线免费观看| 一区二区三区视频免费在线观看| 成人精品一区二区三区电影免费| xvideos亚洲| 超碰97人人做人人爱少妇| 国产精品免费久久久久影院| 亚洲国产天堂久久国产91| 欧美成人精品h版在线观看| 国产91在线高潮白浆在线观看| 中文字幕日韩综合av| 日韩在线视频线视频免费网站| 日本亚洲欧美三级| 69影院欧美专区视频| 欧美大尺度在线观看| 国产亚洲视频中文字幕视频| 亚洲国产精品大全| 精品国产欧美一区二区三区成人| 日韩中文字幕免费| 福利视频第一区| 伊人久久精品视频| 国产精品九九久久久久久久| 欧美性xxxxhd| 亚洲精品永久免费精品| 欧美日韩中文字幕综合视频| 欧美在线观看日本一区| 在线观看日韩专区| 欧美丝袜第一区| 色综合久久中文字幕综合网小说| 国产精品精品一区二区三区午夜版| 中日韩美女免费视频网站在线观看| 日本久久久a级免费| 精品亚洲一区二区三区| 亚洲夜晚福利在线观看| 欧美日韩一区二区免费视频| 欧美壮男野外gaytube| 久色乳综合思思在线视频| 麻豆成人在线看| 91精品综合久久久久久五月天| 亚洲美女久久久| 久久久亚洲精品视频| 久久精品中文字幕电影| 久久久欧美精品| 久久精品久久久久久国产 免费| 久久久精品在线观看| www.日本久久久久com.| 久久偷看各类女兵18女厕嘘嘘| 国产精品自产拍在线观| 久久久免费精品| 欧美日韩午夜视频在线观看| 亚洲自拍小视频| 亚洲欧美日韩在线高清直播| 日韩精品视频观看| 久久久久亚洲精品国产| 久久中文精品视频| 欧美激情videos| 国产精品免费一区二区三区都可以| 久久中国妇女中文字幕| 日日噜噜噜夜夜爽亚洲精品| 国自产精品手机在线观看视频| 国产精品高潮呻吟久久av无限| 国产成人精品视频在线| 日本免费久久高清视频| 国产精品xxxxx| 欧美一级视频在线观看| 国产精品九九九| 亚洲社区在线观看| 日韩欧美主播在线| 国产一区二区三区丝袜| 欧美一级淫片播放口| 国产成人精品a视频一区www| 亚洲人成啪啪网站| 91美女福利视频高清| 国产精品久久久91| 亚洲男人天堂2019| 福利精品视频在线| 国产91ⅴ在线精品免费观看| 亚洲成色777777在线观看影院| 日韩大片免费观看视频播放| 国产精品xxx视频| zzijzzij亚洲日本成熟少妇| 欧美另类第一页| 欧美日韩亚洲系列| 精品日本美女福利在线观看| 亚洲专区国产精品| 久久久久久久久国产| 精品久久久久久国产91| 国产精品午夜视频| 欧美国产日韩在线| 欧美乱大交xxxxx另类电影| 国产综合久久久久| 午夜精品在线观看| 日韩高清人体午夜| 国外视频精品毛片| 欧美高清第一页| 亚洲自拍偷拍色片视频| 久久黄色av网站| 高清一区二区三区四区五区| 欧美高清第一页| 777午夜精品福利在线观看| 91精品国产99| 91欧美视频网站| 国产精品久久一| 成人黄色av播放免费| 国产成+人+综合+亚洲欧美丁香花| 国产精品色婷婷视频| 亚洲一区二区三区xxx视频| 欧美一区深夜视频| 亚洲精品午夜精品| www.亚洲一区| 91精品久久久久久久久| 国产精品丝袜久久久久久高清| 精品国产依人香蕉在线精品| 色综合男人天堂| 午夜精品一区二区三区在线视| 在线观看欧美日韩国产| 中文字幕综合在线| 国产一区二区动漫| 久久理论片午夜琪琪电影网| 久久久视频免费观看| 亚洲人成在线电影| 国产精品视频免费观看www| 97成人精品区在线播放| 亚洲免费小视频| 国产精品久久久久久影视| 久久久免费观看| 精品成人国产在线观看男人呻吟| 欧美在线观看网址综合| 欧美在线不卡区| 欧美激情精品久久久久久久变态| 国产精品久久久av| 97在线视频免费看| 高清欧美性猛交xxxx黑人猛交| 亚洲高清一区二| 亚洲一区亚洲二区| 亚洲剧情一区二区| 亚洲欧美成人一区二区在线电影| 亚洲自拍中文字幕| 日韩中文字幕久久| 国产成人综合精品| 国产精品国产三级国产aⅴ浪潮| 国产精品白嫩美女在线观看| 国产在线视频2019最新视频| 国产深夜精品福利| 久久精品久久精品亚洲人| 日韩欧美高清视频| 日韩精品视频免费| 青青草原一区二区| 亚洲黄色www网站| 亚洲综合中文字幕在线| 成人久久久久久久| 91久久精品久久国产性色也91| 欧美色欧美亚洲高清在线视频| 国产91精品黑色丝袜高跟鞋| 北条麻妃在线一区二区| 亚洲xxx自由成熟| 久久影视电视剧免费网站清宫辞电视| 欧美黑人巨大精品一区二区| 欧美成人中文字幕在线| 日韩大片在线观看视频|