夜光带你走进C#语言 中级版本(15)

本文深入探讨了C#中的泛型概念,包括泛型类、方法和委托的使用,展示了如何利用泛型增强代码的重用性和安全性。通过具体实例,如泛型数组和泛型方法的交换操作,以及泛型委托的应用,详细解释了泛型在不同场景下的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

夜光序言:

 

我不知道自己到底在执着什么,但我知道我一直都在为难自己。有的时候难过的不是结局不够好,而是真诚没有被善待。

 

 

 

 

 

 

 

 

 

 

 

正文:

C# 泛型(Generic)

泛型(Generic) 允许我们延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。

 

换句话说,泛型允许我们编写一个可以与任何数据类型一起工作的类或方法。

 

我们可以通过数据类型的替代参数编写类或方法的规范。

当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。

 

实例

using System;

namespace GeniusTest01
{
    public class Class132
    {
        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();
            }
        }
    }
}

 

 

 

 

泛型(Generic)的特性

使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:

  • 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
  • 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
  • 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
  • 您可以对泛型类进行约束以访问特定数据类型的方法。
  • 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

泛型(Generic)方法

在上面的实例中,我们已经使用了泛型类,我们可以通过类型参数声明泛型方法。下面的程序说明了这个概念:

实例

using System;

namespace GeniusTest01
{
    public class Class133
    {
        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();
            }
        }
    }
}

 

 

 

 

 

 

 

 

泛型(Generic)委托

您可以通过类型参数定义泛型委托。例如:

delegate T NumberChanger<T>(T n);

下面的实例演示了委托的使用:

实例

 

 

using System;


delegate T NumberChanger<T>(T n);
namespace GeniusTest01
{
    public class Class134
    {
        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();
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值