日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#中的委托、事件與接口

作者:Z_hongli 更新時間: 2022-11-14 編程語言

C#中的委托、事件與接口

  • 一、委托
    • (一)委托鏈
    • (二)匿名函數
    • (三)Lamda語句
  • 二、事件
  • 三、接口

一、委托

委托:將方法以變量的形式傳遞,以方法的形式執行
注意:賦值方法的返回類型、參數要與委托的一致(如委托定義的參數類型是string,那么賦值的參數類型也要是string,并且參數個數要一樣,委托的定義也是一樣)

詳細解釋:
C#所有的委托派生自 System.Delegate 類,委托是存有對某個方法的引用的一種引用類型變量,委托變量可以當作另一個方法的參數來進行傳遞,實現事件和回調方法。有點類似C++中的函數指針,但是又有所不同。在C++中,函數指針不是類型安全的,它指向的是內存中的某一個位置,我們無法判斷這個指針實際指向什么,對于參數和返回類型難以知曉。而C#的委托則完全不同,它是類型安全的,我們可以清晰的知道委托定義的返回類型和參數類型。

namespace delegation
{
    //定義一個有參數并且無返回值的委托
    public delegate void SayHelloDlg(string name);
    class Program
    {
        static void Main(string[] args)
        {
            //委托的聲明
            SayHelloDlg dlg = SayHello;
            //委托的使用
            dlg("小朱");
            Console.ReadKey();
        }

        public static void SayHello(string name)
        {
            Console.WriteLine($"{name},你好呀!");
        }
    }
}

運行結果:
在這里插入圖片描述

(一)委托鏈

委托鏈會按照委托注冊的順序依次執行委托

namespace delegation
{
    //定義一個有參數并且無返回值的委托
    public delegate void SayHelloDlg(string name);
    class Program
    {
        static void Main(string[] args)
        {
            //委托的聲明
            SayHelloDlg dlg = SayHello;
            
            //委托鏈
            dlg += SayGoodBye;
            
            //委托的使用
            dlg("小朱");

            Console.ReadKey();

        }

        public static void SayHello(string name)
        {
            Console.WriteLine($"{name},你好呀!");
        }

        public static void SayGoodBye(string name)
        {
            Console.WriteLine($"{name},再見!");
        }
    }
}

運行結果:
在這里插入圖片描述
注意:

Dlg += function  增加注冊委托
Dlg -= function  刪除注冊委托

(二)匿名函數

匿名函數:不用在下面生成一個獨立的方法 如果只需要調用一次的話

namespace delegation
{
    //定義一個有參數并且無返回值的委托
    public delegate void SayHelloDlg(string name);
    class Program
    {
        static void Main(string[] args)
        {

            //匿名函數 不用在下面生成一個獨立的方法 如果只需要調用一次的話
            SayHelloDlg dlg1 = delegate (string name)
            {
                Console.WriteLine($"{name},我是匿名函數!");
            };
            //委托的使用
            dlg1("小朱");
            Console.ReadKey();
        }
    }
}

(三)Lamda語句

相對于匿名函數來說更加的簡潔

namespace delegation
{
    //定義一個有參數并且無返回值的委托
    public delegate void SayHelloDlg(string name);
    class Program
    {
        static void Main(string[] args)
        {
            //Lamda語句
            SayHelloDlg dlg2 = (name) =>
            {
                Console.WriteLine($"{name},我是Lamda語句!");
            };
            
            //委托的使用
            dlg2("小朱");
            Console.ReadKey();
        }
    }
}

運行結果:
在這里插入圖片描述

二、事件

事件:(簡單理解)一個被限制了的委托變量

**詳解:**委托相當于一系列函數的抽象類,這一系列函數要求擁有相同的參數和返回值;而事件(event)相當于委托的一個實例,事件是委托類型的成員,委托可以定義在類外面,而事件只能定義在類里面。

namespace delegation
{
    //定義一個有參數并且無返回值的委托
    public delegate void SayHelloDlg(string name);
    class Program
    {
        //聲明事件
        public static event SayHelloDlg SayHelloEvent;

        static void Main(string[] args)
        {

            SayHelloEvent += Progame_SayHelloEvent;
            if (SayHelloEvent != null)
                SayHelloEvent("小朱");

            Console.ReadKey();

        }

        public static void Progame_SayHelloEvent(string name)
        {
            Console.WriteLine($"{name},我是一個事件!");
        }

    }
}

三、接口

接口定義了所有類繼承接口時應遵循的語法合同。接口定義了語法合同 “是什么” 部分,派生類定義了語法合同 “怎么做” 部分。
接口定義了屬性、方法和事件,這些都是接口的成員。接口只包含了成員的聲明。成員的定義是派生類的責任。接口提供了派生類應遵循的標準結構。

原文鏈接:https://blog.csdn.net/Z_hongli/article/details/127831765

欄目分類
最近更新