C# 泛型的功能及使用,如何声明泛型类,如何声明泛型接口`
泛型无处不在
泛型可以减少成员膨胀及类型膨胀
泛型可以在类型,接口,委托,方法,属性,字段中使用
在列表、字典及元组中也都在应用泛型
通过代码来熟悉泛型类及泛型接口
泛型类的使用方式及用法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp_Generic
{
// 此例用于说明如何使用一个泛型类,并通过泛型类来减少类型的膨胀及成员的膨胀
// 试想下如果声明此例中分别为每个物品声明一个箱子类那么就会导致Box类型膨胀,你需要声明很多个盒子类并且当物品类增加减少时不利用管理
// 如果在一个Box类中声明全部物品的类型,那么当实例化时其每个实例只装载了一个物品对于其他物品成员来说无法再使用就是浪费资源,这就是成员膨胀
internal class Program
{
static void Main(string[] args)
{
// 声明苹果类的实例
Apple apple = new Apple();
apple.colour = "Red";
// 声明书类的实例
Book book = new Book();
book.name = "C book";
//Box box = new Box();
// 声明一个基于苹果类型的泛型实例
Box<Apple> AppleBox = new Box<Apple>();
AppleBox.t_ContainItem = apple;
Console.WriteLine(AppleBox.t_ContainItem.colour);
// 声明一个基于书类型的泛型实例
Box<Book> bookBox = new Box<Book>();
bookBox.t_ContainItem = book;
Console.WriteLine(bookBox.t_ContainItem.name);
Console.ReadLine();
}
}
// 声明一个苹果类
class Apple
{
public string colour { get; set; }
}
// 声明一个书类
class Book
{
public string name { get; set; }
}
// 构建Box类的泛型,通过泛型来调整构建实例时需要装填物品的类型
class Box<T_ContainItem>
{
public T_ContainItem t_ContainItem { get; set; }
}
}
泛型接口的使用方式及用法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp_InterfaceGeneric
{
// 这个示例用于演示如何使用泛型接口
internal class Program
{
static void Main(string[] args)
{
// 构建了学生类的实例,由于泛型类未明确类型在此处需要明确泛型的类型
Student<int> student = new Student<int>();
student.id = 101;
student.name = "Tom";
Console.WriteLine("Student ID:{0},name:{1}",student.id, student.name);
// 构建了老师类的实例,由于在类在实现泛型接口时已经明确了类型,此处不必再明确类型,构建实例时已经与普通的构建没有区别了
Teacher teacher = new Teacher();
teacher.id = 20001;
teacher.name = "Jerry";
Console.WriteLine("Teacher ID: {0}, name: {1}", teacher.id, teacher.name);
Console.ReadLine();
}
}
// 声明一个接口泛型类
interface IUnique<Tid>
{
// 声明接口类内的成员时不必添加修饰符,接口的默认修饰符都是Public,在成员字段后面不必加分号
Tid id { get; set; }
}
// 声明了实现泛型接口的类,注意在此处接口的类型并没有明确,此时这个类的类型需要在构建实例时明确了
class Student<Tid> : IUnique<Tid>
{
public Tid id { get; set; }
public string name { get; set; }
}
// 声明了实现泛型的接口类,但在此处已经在泛型接口处明确了,在此后实例过程中就固定为此类型不必再明确了
class Teacher : IUnique<ulong>
{
public ulong id { get; set ; }
public string name { get; set; }
}
}
总结
泛型在C#中无处不在,如果合理使用可以大提高编程的效率及代码的可维护性。
泛型是在忽略数据类型的前提下声明并在最终构建实例时最终确定需要类型,这样可以适用各种情况下相同逻辑类的统一声明,在后续如果需要更新代码也大大减少了代码的维护工作,因为其更新的逻辑适用于其所有的可用类型。