Tutorial C#login
Tutorial C#
pengarang:php.cn  masa kemas kini:2022-04-11 14:06:23

C# Generik



Generik Membolehkan anda menangguhkan penulisan spesifikasi jenis data untuk elemen pengaturcaraan dalam kelas atau kaedah sehingga ia benar-benar digunakan dalam atur cara masa. Dalam erti kata lain, generik membolehkan anda menulis kelas atau kaedah yang boleh berfungsi dengan mana-mana jenis data.

Anda boleh menulis spesifikasi kelas atau kaedah melalui parameter penggantian jenis data. Apabila pengkompil menemui panggilan fungsi kepada pembina atau kaedah kelas, ia menjana kod untuk mengendalikan jenis data yang ditentukan. Contoh mudah berikut akan membantu anda memahami konsep ini:

using System;
using System.Collections.Generic;

namespace GenericApplication
{
    public class MyGenericArray<T>
    {
        private T[] array;
        public MyGenericArray(int size)
        {
            array = new T[size + 1];
        }
        public T getItem(int index)
        {
            return array[index];
        }
        public void setItem(int index, T value)
        {
            array[index] = value;
        }
    }
           
    class Tester
    {
        static void Main(string[] args)
        {
            // 声明一个整型数组
            MyGenericArray<int> intArray = new MyGenericArray<int>(5);
            // 设置值
            for (int c = 0; c < 5; c++)
            {
                intArray.setItem(c, c*5);
            }
            // 获取值
            for (int c = 0; c < 5; c++)
            {
                Console.Write(intArray.getItem(c) + " ");
            }
            Console.WriteLine();
            // 声明一个字符数组
            MyGenericArray<char> charArray = new MyGenericArray<char>(5);
            // 设置值
            for (int c = 0; c < 5; c++)
            {
                charArray.setItem(c, (char)(c+97));
            }
            // 获取值
            for (int c = 0; c < 5; c++)
            {
                Console.Write(charArray.getItem(c) + " ");
            }
            Console.WriteLine();
            Console.ReadKey();
        }
    }
}

Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:

0 5 10 15 20
a b c d e

Ciri Generik (Generik)

Menggunakan generik ialah teknik yang meningkatkan kefungsian program, khususnya dalam aspek berikut:

  • Ia membantu anda memaksimumkan kod Guna Semula, melindungi keselamatan jenis dan meningkatkan prestasi.

  • Anda boleh membuat kelas koleksi generik. Pustaka kelas .NET Framework termasuk kelas koleksi generik baharu dalam ruang nama System.Collections.Generic. Anda boleh menggunakan kelas koleksi generik ini sebagai ganti kelas koleksi dalam System.Collections.

  • Anda boleh mencipta antara muka generik, kelas generik, kaedah generik, acara generik dan perwakilan generik anda sendiri.

  • Anda boleh mengekang kelas generik untuk mengakses kaedah jenis data tertentu.

  • Maklumat tentang jenis yang digunakan dalam jenis data generik boleh diperolehi pada masa jalan dengan menggunakan refleksi.

Kaedah generik

Dalam contoh di atas, kami telah menggunakan kelas generik dan kami boleh mengisytiharkan kaedah generik melalui parameter jenis. Program berikut menggambarkan konsep ini:

using System;
using System.Collections.Generic;

namespace GenericMethodAppl
{
    class Program
    {
        static void Swap<T>(ref T lhs, ref T rhs)
        {
            T temp;
            temp = lhs;
            lhs = rhs;
            rhs = temp;
        }
        static void Main(string[] args)
        {
            int a, b;
            char c, d;
            a = 10;
            b = 20;
            c = 'I';
            d = 'V';

            // 在交换之前显示值
            Console.WriteLine("Int values before calling swap:");
            Console.WriteLine("a = {0}, b = {1}", a, b);
            Console.WriteLine("Char values before calling swap:");
            Console.WriteLine("c = {0}, d = {1}", c, d);

            // 调用 swap
            Swap<int>(ref a, ref b);
            Swap<char>(ref c, ref d);

            // 在交换之后显示值
            Console.WriteLine("Int values after calling swap:");
            Console.WriteLine("a = {0}, b = {1}", a, b);
            Console.WriteLine("Char values after calling swap:");
            Console.WriteLine("c = {0}, d = {1}", c, d);
            Console.ReadKey();
        }
    }
}

Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:

Int values before calling swap:
a = 10, b = 20
Char values before calling swap:
c = I, d = V
Int values after calling swap:
a = 20, b = 10
Char values after calling swap:
c = V, d = I

Perwakilan generik

Anda boleh menentukan perwakilan generik melalui jenis parameter. Contohnya:

delegate T NumberChanger<T>(T n);

Contoh berikut menunjukkan penggunaan perwakilan:

using System;
using System.Collections.Generic;

delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
    class TestDelegate
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }

        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }
        public static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            // 创建委托实例
            NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
            NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
            // 使用委托对象调用方法
            nc1(25);
            Console.WriteLine("Value of Num: {0}", getNum());
            nc2(5);
            Console.WriteLine("Value of Num: {0}", getNum());
            Console.ReadKey();
        }
    }
}

Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:

Value of Num: 35
Value of Num: 175

Laman web PHP Cina