如鵬網 net高級技術 第二章 委托和事件(復習)

委托

  委托是一種數據類型,可以聲明委托類型變量。

  委托是一種可以指向方法的數據類型。

  聲明委托的方式:delegate返回值類型 委托類型名(參數) ?  比如  delegate void MyDel(int n)

  注意這里的除了前面的delegate,剩下部分和聲明一個函數一樣,但是Mydel不是函數名,而是委托類型名

  如何創建委托類型的對象:

    MyDel sp = new Mydel (SayHello) //SayHello需要和MyDel的參數返回值一樣;

      sp這個委托變量就指向SayHello這個方法。

      注意不要寫成new Mydel (SayHello())因為加上()就是調用方法了

  簡化的方法:MyDel sp = SayHello;//編譯器會給搞成new Mydel (SayHello),反編譯看看。

? ?     注意不要寫成MyDel sp = SayHello();

  委托的使用:委托變量之間可以互相賦值,就是一個傳遞指向方法的過程;sp()就是調用指向的方法,如果有參數就傳遞參數。

  委托:是一種指向方法的數據類型。 聲明的語法:delegate int MyDel2(int i,string s); MyDel2是一個數據類型;

? ? ? ?可以聲明一個變量指向和他類型相容的方法

? ? ? ? ? ? ? ?public delegate void MyDel(int n);

? ? ? ? ? ? ? static void M1(int a) { Console.WriteLine("M1"+a); }

? ? ? ? ? ? ? ?MyDel d1 = new MyDel(M1);//聲明MyDel類型的變量,指向一個指向M1方法的對象 //上面的代碼也可以簡化成MyDel d1 = M1;

?    不要把: MyDel d1 = new MyDel(M1); MyDel d1 = M1;

    聲明成: MyDel d1 = new MyDel(M1()); MyDel d1 = M1();

    因為加上括號就代表調用方法了! 拿到一個委托變量的時候MyDel d1 = M1;

     加上括號就代表“執行指向的方法”,參數該怎么傳遞怎么傳遞 委托是引用類型,

    可以為null,如果委托變量是null,那么如果調用的話,就會拋出NullReferenceException;

Func、Action

  .Net中內置兩個泛型委托Func、Action(在“對象瀏覽器”的mscorlib的System下),

  日常開發中基本不用自定義委托類型了。

   Func是有返回值的委托;

  Action是沒有返回值的委托

  試驗一下用Func、 Action代替之前的委托

匿名方法

  使用Delegate的時候很多時候沒必要使用一個普通的方法,因為這個方法只有這個Delegate會用,并且只用一次,這時候使用匿名方法最合適。

?  匿名方法就是沒有名字的方法。 MyDelegate p = delegate(int s){s=10;};

   用匿名方法改造MyMax的例子。

lambda表達式

  函數式編程,在Entity framework編程中用的很多

  1、Action<int> a1 = delegate(int i) { Console.WriteLine(i); }; 可以簡化成(=>讀作goes to):

  2、Action<int> a2 = (int i) => { Console.WriteLine(i); }; 還可以省略參數類型(編譯器會自動根據委托類型推斷):

  3、Action<int> a3 = (i) => { Console.WriteLine(i); }; 如果只有一個參數還可以省略參數的小括號(多個參數不行) Action<int> a4 = i => { Console.WriteLine(i); };

  4、如果委托有返回值,并且方法體只有一行代碼,這一行代碼還是返回值,那么就可以連方法的大括號和return都省略:

    Func<int, int, string> f1 = delegate(int i, int j) { return "結果是" + (i + j); }; Func<int,int,string> f2= (i,j)=>"結果是"+(i+j);

  5、普通匿名類型也是一樣用lambda表達式

委托深入

  集合常用擴展方法:

    Where(支持委托)、Select(支持委托)、Max、Min、OrderBy

     First(獲取第一個,如果一個都沒有則異常)

     FirstOrDefault(獲取第一個,如果一個都沒有則返回默認值)

     Single (獲取唯一一個,如果沒有或者有多個則異常)

    SingleOrDefault (獲取唯一一個,如果沒有則返回默認值,如果有多個則異常)

     關于orderby、關于where的深入分析 ToList、ToArray

委托的組合

  委托對象可以“+相加”,調用組合后的新委托對象會依次調用被組合起來的委托:MyDel m5 = m1+m2+m3;

  組合的委托必須是同一個委托類型

  (*)委托的“-”則是從組合委托中把委托移除;

   (*)委托如果有返回值,則有一些特殊。

  委托的組合一般是給事件用的,用普通的委托的時候很少用

事件

  案例:定一個Person類,定一個監聽年齡變化的事件,當本命年的時候祝賀一下。

  觸發事件的地方要判斷一下是不是事件null

  事件語法:event Mydelegate mdl;

  加了event關鍵字實現事件機制的好處:

    用了event事件,不可以修改事件已經注冊的值;不可以冒充進行事件通知了。只能+=、-=!

委托與事件總結

  委托的作用:

    占位,在不知道將來要執行的方法的具體代碼時,可以先用一個委托變量來代替方法調用(委托的返回值,參數列表要確定)。在實際調用之前,需要為委托賦值,否則為null。

  事件的作用:

     事件的作用與委托變量一樣,只是功能上比委托變量有更多的限制。

    (比如:1.只能通過+=或-=來綁定方法(事件處理程序)2.只能在類內部調用(觸發)事件。)

  (面試題)事件和委托的關系:事件由一個私有的委托變量和add_***和remove_***方法組成;

     事件的非簡化寫法:聲明一個私有的委托變量和add、remove方法。

委托和事件的區別和關系

  錯誤的說法“事件是一種特殊的委托”

   委托用的比較多,事件只有開發WinForm、WPF的時候用的才比較多,而WinForm、WPF則不是學習重點。掌握“事件和語法”、“委托和事件的關系和區別(面試題)”即可。

  事件監聽的代碼的快速生成;WinForm中的事件簡單分析(誰調用的Onclick方法)

   事件、索引器、屬性本質上都是方法。(面試題)接口中可以定義什么?接口中只可以定義方法。接口中也可以定義“事件、索引器、屬性”,因為他們本質上也都是方法。

轉載于:https://www.cnblogs.com/wjs5943283/p/9401046.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451813.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

黃文俊:Serverless小程序后端技術分享

歡迎大家前往騰訊云社區&#xff0c;獲取更多騰訊海量技術實踐干貨哦~ 黃文俊&#xff0c;現任騰訊云SCF無服務器云函數高級產品經理&#xff0c;多年企業級系統開發和架構工作經驗&#xff0c;對企業級存儲、容器平臺、微服務架構、無服務器計算等領域均有涉獵。今天講的是怎么…

最少編碼原則

本文作者是一位資深軟件工程師&#xff0c;他根據多年的編程經驗&#xff0c;把自己的觀點組織整理成本文&#xff0c;希望能給大家一點啟發。 “最少編碼原則”并不是說寫的代碼少到令意思表達不清楚。其實在很多情況下&#xff0c;可以只寫幾行代碼就能執行相同的邏輯&#x…

什么是標記接口

標識接口的作用 標識接口是沒有任何方法和屬性的接口。標識接口不對實現它的類有任何語義上的要求&#xff0c;它僅僅表明實現它的類屬于一個特定的類型。 標接口在Java語言中有一些很著名的應用&#xff0c;比如java.io.Serializable和java.rmi.Remote等接口便是標識接口。標識…

18--兩數之和 II - 輸入有序數組

文章目錄1.問題描述2.解題代碼1.問題描述 給定一個已按照升序排列 的有序數組&#xff0c;找到兩個數使得它們相加之和等于目標數。 函數應該返回這兩個下標值 index1 和 index2&#xff0c;其中 index1 必須小于 index2。 說明: 返回的下標值&#xff08;index1 和 index2&a…

阿里巴巴 連接池 druid 的使用、maven依賴

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. Druid是一個JDBC組件&#xff0c;它包括三部分&#xff1a; DruidDriver 代理Driver&#xff0c;能夠提供基于Filter&#xff0d;…

Oracle數據庫(二)—— 基本的SQL SELECT語句

&#xff08;一&#xff09;SQL語句分為一下三種類型 DML:Date Manipulation Language 數據操縱語言DDL&#xff1a;Data Definition Language 數據定義語言DCL&#xff1a;Data Control Language 數據控制語言DML&#xff1a;用于查詢與修改數據記錄 包括如下SQL語句&#xff…

簡單 3 步實現高效編程

本文的內容可能部分開發者已經了解&#xff0c;并且已經按照這些方法實施了。但本文還是想強調這些方法&#xff0c;因為這些簡單的方法可以讓你的工作更加高效。要想實現高效編程&#xff0c;最主要的是集中注意力&#xff0c;但這往往也是比較難以實現的&#xff0c;因為你在…

bootstrap table footerFormatter用法 統計列求和 sum、average等

其實上一篇blog里已經貼了代碼&#xff0c;簡單解釋一下吧&#xff1a; 1、showFooter: true,很重要&#xff0c;設置footer顯示&#xff1a; $(cur_table).bootstrapTable({url: /etestpaper/getPaperQType,method: get,queryParams: {strParentID: parentid},ajaxOptions: {s…

19--兩數之和

文章目錄1.題目要求2.代碼詳情1.題目要求 2.代碼詳情 java:暴力求解法hashmap法 class Solution {// 方法一&#xff1a;暴力求解法// public int[] twoSum(int[] nums, int target) {// int n nums.length;// for (int i0; i<n; i){// for (int ji1; j…

單利設計模式

單利設計模式 A&#xff1a;保證對象在內存中只有一個。 B&#xff1a;如何保證&#xff1f; **不能讓其他類來創建對象。 **本類中要創建一個本類對象。 **對外提供公共的訪問。 C&#xff1a;步驟 我們的類是Student **private Student(){} **Student s new Student(); **p…

MVC表示層框架——Velocity技術

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Velocity&#xff0c;名稱字面翻譯為&#xff1a;速度、速率、迅速&#xff0c;用在Web開發里&#xff0c;用過的人可能不多&#xff0c…

redis的配置文件

redis的配置文件 之前在實習的時候才開始接觸redis&#xff0c;隨著對redis的理解加深&#xff0c;才慢慢明白它的強大&#xff0c;也逐漸對他的配置有了一定的了解。下面就分享給大家&#xff0c;以便日后查看。 位置 redis的配置文件名為redis.conf在它的安裝目錄下。 參數說…

你的代碼(軟件)安全嗎?【信息圖】

2011年安全事件層出不窮&#xff0c;幾乎可以稱為“黑客年”。以前黑客通常是利用程序漏洞來造成破壞&#xff0c;令網站陷入尷尬的境地&#xff0c;但如今他們卻是為了竊取數據、IP地址&#xff0c;或者通過在網站中植入木馬將惡意軟件安裝到訪客的電腦里&#xff0c;更有甚者…

20--兩個數組的交集

文章目錄1.問題描述2.代碼詳情1.問題描述 給定兩個數組&#xff0c;編寫一個函數來計算它們的交集。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2] 示例 2&#xff1a; 輸入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 輸…

MD5密碼加密

using System; using System.Security.Cryptography; using System.Text; namespace DimoNetwork.Common.DEncrypt { public enum MD5ResultMode : byte { Strong 0, Weak 1 } /// /// 在應用程序中定義用于單向加密文本的方法 /// public class TextEncrypt { private TextE…

跳出IT運維怪圈 看南方報業如何主動出擊

雖說世界上沒有一勞永逸的事情&#xff0c;不過借助某些方案&#xff0c;IT運維倒可做到事半功倍。近日&#xff0c;南方報業傳媒集團采用新華三智動遠程運維服務解決方案&#xff0c;利用7*24級別安仔的桌面服務&#xff0c;實現IT運維智能化、自動化管理&#xff0c;有效保障…

ORA-01841: (完整) 年份值必須介于 -4713 和 +9999 之間, 且不為 0情況解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 報錯&#xff1a;ORA-01841: (完整) 年份值必須介于 -4713 和 9999 之間, 且不為 0 2. 我的sql是&#xff1a; <!-- 查詢 推薦下載…

網絡傳輸與加密

談到網絡&#xff0c;就必然會涉及網絡安全。但“安全”這個事情&#xff0c; 一下子就會讓人聯想到黑客&#xff0c;進而把“安全”這個事情無限放大為各種高大上、神秘莫測、不可知。這不是一個engineer應有的態度&#xff08;《一次艱難debug的反思》&#xff09;。 要討論網…

21--最小棧

文章目錄1.問題描述2. 代碼詳情1.問題描述 設計一個支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常數時間內檢索到最小元素的棧。 push(x) —— 將元素 x 推入棧中。 pop() —— 刪除棧頂的元素。 top() —— 獲取棧頂元素。 getMin() —— 檢索棧中的…