cari
Rumahpembangunan bahagian belakangTutorial C#.NetC#基础知识整理 基础知识(20) 委托(一)

委托和事件在C#中使用很多,尤其在进行窗体编程时,很多的操作都要通过委托和事件来处理和传递。这里详细解释下委托和事件的用法和原因,使我们在写代码时能更加明白一些。
委托的使用
事件是一种机制,事件是通过委托实现的,所以看明白了委托,对于事件也就能更好的理解了。先看下面一个小例子。
这是描述不同语言的程序员的代码:
比如使用C#的程序员我们这样描述,其中programerName参数表示这个程序员的姓名。

        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

使用Java的,

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }

那么这么多语言,怎么区分这是哪个程序员呢?使用一个枚举来表示,

    public enum ProgramLanguage
    {
        CSharp,

        C,

        Java
    }

那么进行一个完整的描述,代码如下:

   public class ProgramerDescription
    {
        //01
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }

        //02
        public void Description(string programerName, ProgramLanguage type)
        {
            switch (type)
            {
                case ProgramLanguage.CSharp:

                    CsharpProgramer(programerName);

                    break;

                case ProgramLanguage.C:

                    CProgramer(programerName);

                    break;

                case ProgramLanguage.Java:

                    JavaProgramer(programerName);

                    break;

                default:

                    Console.WriteLine("A kind of new Language that you never heard of.");

                    break;
            }
        }
    }

    public enum ProgramLanguage
    {
        CSharp,

        C,

        Java
    }

调用:

            ProgramerDescription pm = new ProgramerDescription();

            pm.Description("杨友山", ProgramLanguage.CSharp);

这时,输出"杨友山 使用C#编程!";
这样就初步完成了一个对程序员描述的简单实现。这里的Description方法是通过一个枚举类型来区别不同的语言。这样它的维护性是比较差的,因为还有很多编程语言(C++,php,等),如果想加一种语言就要增加一个对应的方法,然后就要修改ProgramLanguage这个枚举类型。增加方法对原程序影响不大,因为可以用分部类来实现,而修改枚举就不合适了,这也不符合面向对象设计思想的开放封闭原则。
那么在Description方法中怎么处理呢,也就是不用枚举了,Description方法如何来区分该调用哪个方法(CsharpProgramer,CProgramer,JavaProgramer)对程序员进行描述。
public void Description(string programerName, 某类型 某参数)
{
   //调用对应的方法
}
这里的某类型就是要用它来区别哪个方法的类型,换句话说,最好就是在这里我直接把我想要调用的方法当做参数传进去。比如我要调用CProgramer方法来描述C程序员,
            ProgramerDescription pm = new ProgramerDescription();

            pm.Description("D.M.Ritchie", CProgramer);
按照这个想法,public string Description(string programerName, 某类型 某参数)的“某类型 某参数”该怎么表示呢?
当然我们就想到C#中的委托delegate了。委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。 用委托来完成上述的代码:

    public class ProgramDescriptionDelegate
    {
        //委托,表示方法
        public delegate void DescriptionDelegate(string programerName);

        //01
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
             Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
             Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }

        //02
        public void Description(string programerName, DescriptionDelegate description)
        {
            description(programerName);
        }
    }

调用:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            pm.Description("杨友山", pm.CsharpProgramer);

结果是和最开始的代码是一样的。
什么是委托?MSDN这样解释的:委托是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联,可以通过委托调用方法。委托用于将方法作为参数传递给其他方法。时间处理程序就是通过委托调用的方法。

仔细看使用委托的代码,
public void Description(string programerName, DescriptionDelegate description)。调用时,
DescriptionDelegate description传入的是 pm.CsharpProgramer,也就是此时description=pm.CsharpProgramer。其实我们还可以这样调用:

                    //方法和委托绑定
            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                csharpDelegate = pm.CsharpProgramer;

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                cdelegate = pm.CProgramer;

            pm.Description("杨友山", csharpDelegate);

            pm.Description("D.M.Ritchie", cdelegate);

结果:

再做修改:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

            pm.Description("杨友山", pdelegate);

结果:

这里先执行了pm.CsharpProgramer,然后又执行了pm.CProgramer方法。
可以看出委托不光可以将方法作为参数,而且还可以将方法绑定,而起还可以绑定多个。
使用+=绑定方法,取消则使用-=进行取消,上面的调用可以修改如下:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

            pdelegate -= pm.CProgramer;

            pm.Description("杨友山", pdelegate);

这样就只调用pm.CsharpProgramer;一个方法了。

以上就是C#基础知识整理 基础知识(20) 委托(一)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Kenyataan
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
C# .NET: Meneroka Konsep Teras dan Asas PengaturcaraanC# .NET: Meneroka Konsep Teras dan Asas PengaturcaraanApr 10, 2025 am 09:32 AM

C# adalah bahasa pengaturcaraan yang berorientasikan objek moden yang dibangunkan oleh Microsoft dan sebagai sebahagian daripada Rangka Kerja .NET. 1.C# menyokong pengaturcaraan berorientasikan objek (OOP), termasuk enkapsulasi, warisan dan polimorfisme. 2. Pengaturcaraan Asynchronous dalam C# dilaksanakan melalui Async dan menunggu kata kunci untuk meningkatkan respons aplikasi. 3. Gunakan LINQ untuk memproses koleksi data dengan ringkas. 4. Kesilapan umum termasuk pengecualian rujukan null dan pengecualian indeks luar. Kemahiran penyahpepijatan termasuk menggunakan debugger dan pengendalian pengecualian. 5. Pengoptimuman Prestasi termasuk menggunakan StringBuilder dan mengelakkan pembungkusan yang tidak perlu dan unboxing.

Ujian C# .NET Aplikasi: Unit, Integrasi, dan Ujian Akhir ke AkhirUjian C# .NET Aplikasi: Unit, Integrasi, dan Ujian Akhir ke AkhirApr 09, 2025 am 12:04 AM

Strategi ujian untuk aplikasi C#. NET termasuk ujian unit, ujian integrasi, dan ujian akhir-ke-akhir. 1. Ujian unit memastikan bahawa unit minimum kod berfungsi secara bebas, menggunakan rangka kerja MSTest, Nunit atau Xunit. 2. Ujian Bersepadu Mengesahkan fungsi pelbagai unit yang digabungkan, data simulasi yang biasa digunakan dan perkhidmatan luaran. 3. Ujian akhir-ke-akhir mensimulasikan proses operasi lengkap pengguna, dan selenium biasanya digunakan untuk ujian automatik.

Advanced C# .NET Tutorial: Ace Wawancara Pemaju Kanan Anda SeterusnyaAdvanced C# .NET Tutorial: Ace Wawancara Pemaju Kanan Anda SeterusnyaApr 08, 2025 am 12:06 AM

Temu bual dengan pemaju kanan C# memerlukan menguasai pengetahuan teras seperti pengaturcaraan asynchronous, LINQ, dan prinsip kerja dalaman Rangka .NET. 1. Pengaturcaraan Asynchronous memudahkan operasi melalui async dan menunggu untuk meningkatkan respons aplikasi. 2.Linq mengendalikan data dalam gaya SQL dan perhatikan prestasi. 3. CLR kerangka bersih menguruskan ingatan, dan pengumpulan sampah perlu digunakan dengan berhati -hati.

C# .NET Soalan & Jawapan Wawancara: Tahap kepakaran andaC# .NET Soalan & Jawapan Wawancara: Tahap kepakaran andaApr 07, 2025 am 12:01 AM

C#.NET Soalan dan jawapan wawancara termasuk pengetahuan asas, konsep teras, dan penggunaan lanjutan. 1) Pengetahuan asas: C# adalah bahasa berorientasikan objek yang dibangunkan oleh Microsoft dan digunakan terutamanya dalam rangka .NET. 2) Konsep teras: Delegasi dan peristiwa membolehkan kaedah mengikat dinamik, dan LINQ menyediakan fungsi pertanyaan yang kuat. 3) Penggunaan Lanjutan: Pengaturcaraan Asynchronous meningkatkan respons, dan pokok ekspresi digunakan untuk pembinaan kod dinamik.

Membina Microservices dengan C# .NET: Panduan Praktikal untuk ArkitekMembina Microservices dengan C# .NET: Panduan Praktikal untuk ArkitekApr 06, 2025 am 12:08 AM

C#.NET adalah pilihan yang popular untuk membina microservices kerana ekosistem yang kuat dan sokongan yang kaya. 1) Buat RestfulAPi menggunakan ASP.Netcore untuk memproses penciptaan pesanan dan pertanyaan. 2) Gunakan GRPC untuk mencapai komunikasi yang cekap antara microservices, menentukan dan melaksanakan perkhidmatan pesanan. 3) Memudahkan penggunaan dan pengurusan melalui microservices kontena Docker.

C# .NET Keselamatan Amalan Terbaik: Mencegah Kelemahan BiasaC# .NET Keselamatan Amalan Terbaik: Mencegah Kelemahan BiasaApr 05, 2025 am 12:01 AM

Amalan terbaik keselamatan untuk C# dan .NET termasuk pengesahan input, pengekodan output, pengendalian pengecualian, serta pengesahan dan kebenaran. 1) Gunakan ungkapan biasa atau kaedah terbina dalam untuk mengesahkan input untuk mengelakkan data berniat jahat memasuki sistem. 2) Pengekodan output Untuk mencegah serangan XSS, gunakan kaedah httputility.htmlencode. 3) Pengendalian Pengecualian Menghindari kebocoran maklumat, ralat rekod tetapi tidak mengembalikan maklumat terperinci kepada pengguna. 4) Gunakan Asp.Netidentity dan kebenaran berasaskan tuntutan untuk melindungi aplikasi daripada akses yang tidak dibenarkan.

Dalam bahasa C: Apa maksudnyaDalam bahasa C: Apa maksudnyaApr 03, 2025 pm 07:24 PM

Makna kolon (':') dalam bahasa C: Penyataan bersyarat: Memisahkan ekspresi bersyarat dan pernyataan blok pernyataan pernyataan: Memisahkan permulaan, bersyarat dan tambahan ekspresi makro Definisi: Memisahkan nama makro dan nilai makro Single Line Comment: Mewakili kandungan dari kolon hingga akhir garis sebagai dimensi array komen: Tentukan dimensi array

Apa maksudnya dalam bahasa CApa maksudnya dalam bahasa CApr 03, 2025 pm 07:21 PM

A dalam bahasa C adalah pengendali pasca kenaikan, dan mekanisme operasinya termasuk: pertama memperoleh nilai pembolehubah a. Meningkatkan nilai A dengan 1. Mengembalikan nilai A selepas meningkat.

See all articles

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)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual