Rumah pembangunan bahagian belakang Tutorial C#.Net C#委托使用详解(Delegates)

C#委托使用详解(Delegates)

Dec 13, 2016 pm 01:34 PM

1. 委托是什么?

其实,我一直思考如何讲解委托,才能把委托说得更透彻。说实话,每个人都委托都有不同的见解,因为看问题的角度不同。个人认为,可以从以下2点来理解:

 (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型。

 (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象。

既然委托是一种类型,那么它存储的是什么数据?

我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

 

2. 委托类型的定义

委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

delegate void MyDel(int x);
Salin selepas log masuk
Salin selepas log masuk

委托类型声明:

(1) 以deleagate关键字开头。

(2)返回类型+委托类型名+参数列表。

delegate void MyDel(int x);
Salin selepas log masuk
Salin selepas log masuk

3. 声明委托变量

MyDel del1,del2;
Salin selepas log masuk

4. 初始化委托变量

(1) 使用new运算符

new运算符的操作数的组成如下:

委托类型名

一组圆括号,其中包含作为调用列表中的第一个成员的方法的名字。方法可以是实例方法或静态方法。

del1 = new MyDel( myInstObj.MyM1 );
del2 = new MyDel( SClass.OtherM2 );
Salin selepas log masuk

(2)使用快捷语法

快键语法,它仅由方法说明符构成。之所以能这样,是因为在方法名称和其相应的委托类型之间有隐式转换。

del1 = myInstObj.MyM1;
del2 = SClass.OtherM2;
Salin selepas log masuk

5. 赋值委托

由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的方法地址引用。旧的引用会被垃圾回收器回收。

MyDel del;
del = myInstaObj.MyM1; //委托初始化del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收
Salin selepas log masuk

6. 组合委托

委托可以使用额外的运算符来组合。这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。

委托是恒定的,操作数委托创建后不会被改变。委托组合拷贝的是操作数的副本。

MyDel del1 = myObj.MyMethod;
MyDel del2 = SClass.OtherM2;
MyDel del3 = del1 + del2;   //组合调用列表
Salin selepas log masuk

7. 委托加减运算

可以使用+=运算符,为委托新增方法。

同样可以使用-=运算符,为委托移除方法。

MyDel del = myObj.MyMethod;
del += SClass.OtherM2; // 增加方法
del -= myObj.MyMethod; // 移除方法
Salin selepas log masuk

8. 委托调用

委托调用跟方法调用类似。委托调用后,调用列表的每个方法将会被执行。

在调用委托前,应判断委托是否为空。调用空委托会抛出异常。

if(null != del)
{
     del();//委托调用
     }
Salin selepas log masuk

9. 匿名方法

匿名方法是在初始化委托时内联声明的方法。

基本结构:

deleage( 参数 ) { 语句块 }
Salin selepas log masuk

例如:

delegate int MyDel (int x); //定义一个委托 

MyDel del = delegate( int x){ return x; };
Salin selepas log masuk

从上面我们可以看到,匿名方法是不会显示声明返回值的。


10. Lambda表达式

Lambda表达式主要用来简化匿名方法的语法。在匿名方法中,delegate关键字有点多余,因为编译器已经知道我们将方法赋值给委托。通过几个简单步骤,我们就可以将匿名方法转换为Lambda表达式:

删除delegate关键字

在参数列表和匿名方法主体之间防Lambda运算符=>。Lambda运算符读作"goes to"。

MyDel del = delegate( int x) { return x; };//匿名方法
MyDel del2 = (int x) => {return x;};//Lambda表达式
MyDel del3 = x => {return x};//简写的Lambda表达式
Salin selepas log masuk


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah alternatif untuk membatalkan bahasa C Apakah alternatif untuk membatalkan bahasa C Mar 03, 2025 pm 05:37 PM

Artikel ini meneroka cabaran penentuan penunjuk null dalam C. Ia berpendapat bahawa masalah itu tidak batal sendiri, tetapi penyalahgunaannya. Artikel ini memperincikan amalan terbaik untuk mencegah dereferensi, termasuk pemeriksaan pra-pengertian, penunjuk inisial

Cara menambah pengkompil C peringkat seterusnya Cara menambah pengkompil C peringkat seterusnya Mar 03, 2025 pm 05:44 PM

Artikel ini menerangkan cara membuat aksara baru dalam C menggunakan urutan \ n Escape dalam Printf dan meletakkan fungsi. Ia memperincikan fungsi dan menyediakan contoh kod yang menunjukkan penggunaannya untuk pecah talian dalam output.

Penyusun bahasa C mana yang lebih baik? Penyusun bahasa C mana yang lebih baik? Mar 03, 2025 pm 05:39 PM

Artikel ini membimbing pemula untuk memilih pengkompil C. Ia berpendapat bahawa GCC, kerana kemudahan penggunaannya, ketersediaan yang luas, dan sumber yang luas, adalah yang terbaik untuk pemula. Walau bagaimanapun, ia juga membandingkan GCC, Clang, MSVC, dan TCC, yang menonjolkan perbezaan mereka

Adakah Null masih penting dalam pengaturcaraan moden dalam bahasa C? Adakah Null masih penting dalam pengaturcaraan moden dalam bahasa C? Mar 03, 2025 pm 05:35 PM

Artikel ini menekankan kepentingan berterusan null dalam pengaturcaraan C moden. Walaupun kemajuan, null tetap penting untuk pengurusan penunjuk yang jelas, mencegah kesalahan segmentasi dengan menandakan ketiadaan alamat memori yang sah. Prac terbaik

Apakah versi web penyusun bahasa C? Apakah versi web penyusun bahasa C? Mar 03, 2025 pm 05:42 PM

Artikel ini mengkaji semula penyusun dalam talian untuk pemula, memberi tumpuan kepada kemudahan penggunaan dan keupayaan debug. Onlineegdb dan Repl.It diserlahkan untuk antara muka mesra pengguna dan alat debugging yang berguna. Pilihan lain seperti programz dan penyusunan

C Laman Web Pengaturcaraan Dalam Talian C Ringkasan Laman Web Rasmi C Laman Web Pengaturcaraan Dalam Talian C Ringkasan Laman Web Rasmi Mar 03, 2025 pm 05:41 PM

Artikel ini membandingkan platform pengaturcaraan dalam talian C, menonjolkan perbezaan ciri -ciri seperti alat debugging, fungsi IDE, pematuhan standard, dan had memori/pelaksanaan. Ia berpendapat bahawa platform "terbaik" bergantung kepada keperluan pengguna,

Kaedah Penyalinan Kod oleh Compiler Bahasa C Kaedah Penyalinan Kod oleh Compiler Bahasa C Mar 03, 2025 pm 05:43 PM

Artikel ini membincangkan penyalinan kod yang efisien dalam c ides. Ia menekankan bahawa penyalinan adalah fungsi IDE, bukan ciri pengkompil, dan strategi butiran untuk kecekapan yang lebih baik, termasuk menggunakan alat pemilihan IDE, lipatan kod, carian/menggantikan, templa

Cara menyelesaikan masalah tidak muncul tetingkap output oleh pengkompil bahasa C Cara menyelesaikan masalah tidak muncul tetingkap output oleh pengkompil bahasa C Mar 03, 2025 pm 05:40 PM

Artikel ini menyelesaikan masalah tingkap output yang hilang dalam kompilasi program C. Ia meneliti sebab -sebab seperti gagal menjalankan kesilapan, kesilapan program, tetapan penyusun yang salah, proses latar belakang, dan penamatan program yang cepat. Penyelesaian melibatkan ch

See all articles