(五十三)C#编程基础复习——C#泛型(Generic)
在C#中,泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型的这一特性我们可以定义通用类(泛型类)或方法(泛型方法)。
定义通用类需要使用尖括号<>,这里的尖括号用于将类或方法声明为泛型。下面通过一个简单的实例来帮助您理解这个概念:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Runtime.InteropServices;
namespace _047
{
/// <summary>
/// 定义泛型类
/// </summary>
class GenericClass<T>
{
//泛型方法
public GenericClass(T msg)
{
Console.WriteLine(msg);
}
}
internal class Program
{
static void Main(string[] args)
{
GenericClass<string> str_gen = new GenericClass<string>("C#语言");
GenericClass<int> int_gen = new GenericClass<int>(12345);
GenericClass<char> char_gen = new GenericClass<char>('C');
Console.ReadKey();
}
}
}
一、泛型的特性
可以将泛型看作是一种增强程序功能的技术,泛型类和泛型方法兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。泛型通常与集合以及作用于集合的方法一起使用,System.Collections.Generic命名空间下就包含几个基于泛型的集合类。下面总结了一些关于泛型的特性:
- 使用泛型类型可以最大限度地重用代码、保护类型的安全性以及提高性能;
- 泛型最常见的用途是创建集合类;
- .NET类库在System.Collections.Generic命名空间中包含几个新的泛型集合类,你可以使用这些类来代替System.Collection中的集合类;
- 你可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托;
- 你也可以对泛型类进行约束以访问特定数据类型的方法;
- 在泛型数据类型中所用类型的信息可在运行时通过使用反射来获取。
二、泛型方法
在上面的示例中我们已经使用了泛型类,除此之外我们可以通过类型参数声明泛型方法。下面通过示例程序来演示一下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace _048
{
internal 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("调用swap之前的int值为:");
Console.WriteLine("a={0},b={1}",a,b);
Console.WriteLine("调用swap之前的char值为:");
Console.WriteLine("c={0},d={1}",c,d);
//调用swap
Swap<int>(ref a, ref b);
Swap<char>(ref c, ref d);
//在交换之后显示值
Console.WriteLine("调用swap之后的int值:");
Console.WriteLine("a={0},b={1}",a,b);
Console.WriteLine("调用swpa之后的char值:");
Console.WriteLine("c={0},d={1}",c,d);
Console.ReadKey();
}
}
}
三、泛型委托
我们还可以使用类型参数定义泛型委托,如下所示:
delegate T NumberChanger<T>(T n);
下面通过示例演示下泛型委托的使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _049
{
internal class Program
{
delegate T NumberChanger<T>(T n);
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("Num的值为:{0}",getNum());
nc2(5);
Console.WriteLine("Num的值为:{0}",getNum());
Console.ReadKey();
}
}
}
分类:
C#基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了