C# —— 深入理解委托類型

一. 委托定義

1. 委托與多播委托

委托類型表示對具有特定參數列表和返回類型的方法的引用,定義了委托實例可以調用的某類方法。 通過委托,我們可以動態的通過委托變量來調用委托方法。一般用delegate來命名委托類型,但Action和Func也可以達到同樣的效果,而且不用聲明委托。
委托實例則是指將方法賦值給委托變量的過程。
多播委托是指一個委托實例可以引用一組委托方法,需要用+或+=來添加委托方法,也可以用-或-=來減去右邊的委托方法,當然對單個委托方法使用-號等于將NULL賦值給委托變量。

2. 實例方法

當委托的對象為實例方法時,不僅會保留對方法的引用,也可以保留對方法實例的引用。

3. 泛型委托類型

委托類型也可以包含泛型委托參數。(泛型是很重要的概念,后面會專門再寫一下)
public delegate T GenericDelagete< T >(T arg);

4. Action

Action是系統內置類型(預定義)的一個委托類型, 沒有返回值,但是可以通過在Action后面聲明泛型來指定方法的參數類型.
Action<int, string> c;
Action<in T1,in T2 … ,in T16>

public class Program{static int Square(int x){int r = x * x;//定義Square方法,求平方Console.WriteLine(r);return r;}static void Cube(int x){int r = x * x * x;//定義Cube方法,求立方Console.WriteLine(r);//return r;}static void Main(){Action<int> Transformer = new Action<int>(Cube);Transformer(7);}}

5. Func

Func 封裝了一個不一定具有參數但卻返回參數指定的類型值的方法。

class Program{static void Main(string[] args){Func<double, double, double> Domulti = calculate.multi;double result = Domulti(13, 14);Console.WriteLine("相乘:{0}", result);calculate c = new calculate();Action<double, double> DoSubstraction = c.substraction;DoSubstraction(521, 1);}}class calculate{public static double multi(double x, double y){return x * y;}public void substraction(double x, double y){Console.WriteLine("相減:{0}", x - y);}}

二. 例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 委托
{delegate int Transformer(int a);//定義一個int類型的委托類,只能調用int類型的方法。public delegate T Tran<T>(T arg);//定義一個泛型委托類型class Num //創建一個類,定義一個Tranform方法,可以遍歷數組值,并將數組值賦給委托方法。{public static void Tranform(int[] values, Transformer d){for (int i = 0; i < values.Length; i++){values[i] = d(values[i]);//將數組的值賦給委托方法}}public int IP(int per){Console.WriteLine(per);return per;}public static void Tran1<T>(T[] values,Tran<T> t){for (int i = 0; i < values.Length; i++){values[i] = t(values[i]);//將數組的值賦給委托方法}}}public class Program{static int Square(int x){int r= x* x;//定義Square方法,求平方Console.WriteLine(r);return r;}static int Cube(int x){ int r= x* x *x;//定義Cube方法,求立方Console.WriteLine(r);return r;}static void Main(){int b;int[] c = {1,2,3 };Transformer e =null;e += Square;//加委托方付//Transformer e = new Transformer(Square); //建立委托實例,也可簡寫成Transformer e = Square;e += Cube;//e -= Square;//減委托方法b = e(3);//等同于b= e.Invoke(3);Num.Tranform(c, Square);//調用Tranform,其中可見可以直接引用Square方法foreach (int i in c){Console.WriteLine($"{i}");//用$可以不用占位符}Num n = new Num(); //委托對象為實例化方法Transformer f = n.IP;  //建立委托實例f(3);Console.WriteLine(f.Target ==n); //實例方法返回Ture,靜態方法返回值為NullNum.Tran1<int>(c, Square);//使用泛型類型的委托調用靜態方法foreach (int i in c){Console.WriteLine($"{i}");//用$可以不用占位符}}}     
}

總結下過程:

  1. 定義一個委托
  2. 創建需要委托調用的方法,該方法的參數需與委托相同
  3. 實例化委托
  4. 通過委托方法調用需要調用的方法.Num.Tranform(c, Square)
    最近看到一個講的特別好:

C#中的委托和事件 - Part.1

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

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

相關文章

【VS開發】【C++語言】reshuffle的容器實現算法random_shuffle()的使用

假設你需要指定范圍內的隨機數&#xff0c;傳統的方法是使用ANSI C的函數random(),然后格式化結果以便結果是落在指定的范圍內。但是&#xff0c;使用這個方法至少有兩個缺點。首先&#xff0c;做格式化時&#xff0c;結果常常是扭曲的&#xff0c;所以得不到正確的隨機數&…

C#委托——基礎2

在上一篇隨筆中&#xff0c;簡要說明了怎樣定義委托&#xff0c;定義事件&#xff0c;訂閱事件&#xff0c;最后也實現了效果&#xff0c;就是當員工類的某個對象&#xff0c;執行某個事件時&#xff0c;委托事件被觸發&#xff0c;后面也得到了結果&#xff0c;但是想象一下實…

機器學習——深度學習之編程工具、流行網絡結構、卷積神經網絡結構的應用

目錄 一、編程工具 caffe實現LENET-5 二、流行的網絡結構 1、VGGNET 2、Googlenet ? 3、ResNet? ? 三、卷積神經網絡的應用 1、人臉識別 ? 2、人臉驗證 3、人臉特征點檢測 4、卷積神經網絡壓縮 一、編程工具 caffe的優點&#xff1a;模型標準化&#xff0c;源代碼…

Halcon例程詳解(激光三角系統標定)—— calibrate_sheet_of_light_calplate.hdev

前言 1 激光三角測距 激光三角測距法原理很簡單,是通過一束激光以一定的入射角度照射被測目標,激光在目標表面會產生漫反射,在另一角度利用透鏡對反射激光匯聚成像,光斑成像在CCD(Charge-coupled Device,感光耦合組件)位置傳感器上。當被測物體沿激光方向發生移動時,…

【轉】如何實現一個文件系統

如何實現一個文件系統 摘要 本章目的是分析在Linux系統中如何實現新的文件系統。在介紹文件系統具體實現前先介紹文件系統的概念和作用&#xff0c;抽象出文件系統概念模型。熟悉文件系統的內涵后&#xff0c;我們再進一步討論Linux系統中文件系統的特殊風格和具體文件系統在Li…

【tenserflow】——數據類型以及常用屬性

目錄 一、什么是Tensor&#xff1f; 二、Tensorflow常見數據類型 三、Tensorflow常見屬性device\cpu\gpu\ndim\shape\rank等 1、創建一個tensor 1&#xff09;tf.constant() 2)tf.Variable() 2、判斷一個變量是否為tensor張量 3、生成不同設備&#xff08;cpu,gpu&#x…

C# 事件詳解附實例分析

一、定義 事件是兩個對象間發布消息和響應后處理消息的過程&#xff0c;通過委托類型來實現的。 事件的機制被稱為發布-訂閱機制&#xff0c;其算法過程為&#xff1a;首先定義一個委托類型&#xff0c;然后在發布者類中聲明一個event事件&#xff0c;同時此類中還有一個用來觸…

網頁開發瀏覽器兼容性問題

1、在ie6下的雙margin問題 在ie6下&#xff0c;設置了float的元素&#xff0c;以float:left為例&#xff0c;如圖所示。會出現第一個浮動元素&#xff0c;即相對于父級元素浮動的&#xff0c;會出現雙倍margin的問題。 注意僅僅是相對于父級元素浮動的&#xff0c;即第一個會出…

【tensorflow】——創建tensor的方法

目錄 1、tf.constant() 2、tf.Variable() 3、tf.zeros():用0去填充指定形狀的數組 4、tf.convert_to_tensor(a,dtypetf.int32) 5、tf.ones():用1去填充指定形狀的數組 6、tf.fill():用指定的元素去填充指定形狀的數組 7、隨機化初始化進行創建 1&#xff09;normal正態分…

Halcon —— 圖像像素類型與轉換

圖像類型 就目前工業領域主流的圖像處理工具halcon來講&#xff0c;有以下幾種圖像類型&#xff1a;‘byte’, ‘complex’, ‘cyclic’, ‘direction’, ‘int1’, ‘int2’, ‘int4’, ‘int8’, ‘real’, ‘uint2’&#xff0c;具體含義如下圖所示。 ‘byte’ 每像素1字節…

軟件方法

核心工作流業務建模&#xff08;組織建模&#xff09;&#xff1a;描述組織內部各個系統如何協作&#xff0c;使得組織可以為其他的組織提供有價值的服務&#xff0c;新系統只不過是組織為了對外提供更好的服務&#xff0c;對自己的內部重新設計而購買的一個零件。需求&#xf…

修改vim中的tab為4個空格

記錄一下&#xff0c;避免用時還得搜........ 1、臨時修改 在vi中&#xff0c;set tabstop4 或 set ts4  2、永久修改 vi --version 查看要修改的文件如果是vim的話&#xff0c;修改~/.vimrc如果是vi&#xff0c;修改~/.exrc加上&#xff1a;set tabstop4set nu //顯示行號set…

Halcon例程詳解(基于卡尺工具的匹配測量方法) —— measure_stamping_part.hdev

前言 1卡尺工具介紹 Halcon中的Metrology方法即為卡尺工具&#xff0c;可用來擬合線&#xff0c;圓&#xff0c;這種方法對于目標比背景很明顯的圖像尺寸測量是很方便的&#xff0c;不需要用blob進行邊緣提取等&#xff0c;但缺點也很明顯&#xff0c;需要目標的相對位置基本…

【TensorFlow】——不同shape的tensor在神經網絡中的應用(scalar,vector,matrix)

目錄 ? 1、scalar——標量 1&#xff09;在神經網絡中存在的場景 2&#xff09;one_hot編碼 3&#xff09;舉例應用 2、vector——向量 ? 3、matrixs——矩陣 4、dim3的tensor 5、dim4的tensor 6、dim5的tensor 本文主要的目的是讓初學者對tensor的各種形式的使用場…

404頁面 3秒后跳到首頁 實現

---恢復內容開始--- 當我們訪問一個頁面不存在的時候&#xff0c;就會跳到404頁面 一般網站都在在404頁面中做一個處理&#xff0c; 就是當用戶3秒種內還沒有任何操作的話&#xff0c;就會自動跳轉到其它頁面 技術實現有兩種方法 1. 在404頁面中的header間加上 <meta http-e…

Java - I/O

File類 java.io操作文件和目錄&#xff0c;與平臺無關。具體的常用實例方法&#xff1a; File file new File("."); // 以當前路徑創建名為 "." 的 File 對象 ? 文件目錄信息函數 ? ? - ? String getName/Path/Parent()&#xff1a; 文件名/路徑…

Halcon —— 邊緣檢測算子詳解

一、算子介紹 1.1 種類 halcon內常用的邊緣檢測算子包括如下幾種&#xff1a; 1.edges_image: 提取2D 圖像邊緣 2.edges_sub_pix&#xff1a;提取2D圖像亞像素邊緣 3.edges_object_model_3d &#xff1a;提取3D圖像邊緣 4.edges_color和edges_color_sub_pix&#xff1a;提取彩…

【TensorFlow】——索引與切片

目錄 1、利用index進行索引 2、利用“&#xff1a;”和“...”進行索引與切片 3、tf.gather&#xff08;&#xff09;——對一個維度進行亂序索引 優勢&#xff1a; 缺點&#xff1a; 例子 4、tf.gather_nd()——同時對多個維度進行索引 5、tf.boolean_mask()——通過布…

華碩(ASUS)X554LP筆記本一開機就進入aptio setup utility 問題的解決

某次因大意一直未插電&#xff0c;華碩&#xff08;ASUS&#xff09;X554LP筆記本后來沒電關機。后來每次一開機就進入aptio setup utility界面&#xff0c;按F9調入默認配置&#xff0c;F10保存后退出&#xff0c;重啟仍然進入aptio setup utility。 網上查了一下&#xff0c;…

redis和memcached緩存

memcached memcache開源的&#xff0c;高性能&#xff0c;高并發分布式內存緩存系統,天生支持集群 memcached下載地址&#xff1a; http://memcached.org/downloads python實現memcached緩存 pip3 install python-memcached import memcache aamemcache.Client(["10.0.0.2…