C# 泛型

概念

泛型实现了类型参数化,达到代码重用目的

通过类型参数化来实现同一份代码上操作多种类型

泛型相当于类型占位符

定义类或方法时使用替代符代表变量类型

当真正使用类或者方法时再具体指定类型

泛型分类

泛型类和泛型接口

基本语法:

class 类名<泛型占位字母>

interface 接口名<泛型占位字母>

泛型函数

基本语法:函数名<泛型占位字母>(参数列表)

注意:泛型占位字母可以有多个,用逗号分开

泛型类和接口

class TestClass<T>

{

public T value;

}

class TestClass2<T1,T2,K,M,LL,Key,Value>

{

public T1 value1;

public T2 value2;

public K value3;

public M value4;

public LL value5;

public Key value6;

public Value value7;

}

interface TestInterface<T>

{

T Value

{

get;

set;

}

}

class Test : TestInterface<int> 这里要指定接口泛型T的类型

{

public int Value { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

}

泛型方法

1.普通类中的泛型方法

class Test2

{

public void TestFun<T>( T value)

{

Console.WriteLine(value);

}

public void TestFun<T>()

{

//用泛型类型 在里面做一些逻辑处理

T t = default(T); //default(类型);返回改类型默认值。

}

public T TestFun<T>(string v)

{

return default(T);

}

public void TestFun<T,K,M>(T t, K k, M m)

{

}

}

2.泛型类中的泛型方法

class Test2<T>

{

public T value;

public void TestFun<K>(K k)

{

Console.WriteLine(k);

}

// ↓这个不叫泛型方法 因为 T是泛型类申明的时候 就指定 在使用这个函数的时候

//我们不能再去动态的变化了

public void TestFun(T t)

{

}

}

泛型的作用

1.不同类型对象的相同逻辑处理就可以选择泛型

2.使用泛型可以一定程度避免装箱拆箱

举例:优化ArrayList

class ArrayList<T>

{

private T\[\] array;

public void Add(T value)

{

}

public void Remove( T value)

{

}

}


cs 复制代码
using System.Collections;


class Judge
{
   public static string  Type <T> ()
    {
        string a;
        if (typeof(T) == typeof(int))
        {
            return a = "整形" + "," + sizeof(int) + "字节";
        }
        else if (typeof(T) == typeof(Char))
        {
            return a = "字符" + "," + sizeof(Char) + "字节";
        }
        else if (typeof(T) == typeof(float))
        {
            return a = "浮点数" + "," + sizeof(float) + "字节";
        }
        else if (typeof(T) == typeof(String))
        {
            return a = "字符串" + "," + "?"+ "字节";
        }
        else { return a = "其他类型"; }
    }

}


class Program
{
  

    public   static void Main()
    {
       Console.WriteLine ( Judge.Type<int>());
        Console.WriteLine(Judge.Type<float >());
        Console.WriteLine(Judge.Type<double >());
        Console.WriteLine(Judge.Type<string >());
        Console.WriteLine(Judge.Type<Char>());
    }
    
}
相关推荐
吴名氏.5 分钟前
Java转AI Agent教程(第五周)Prompt工程
java·人工智能·prompt·ai agent
8Qi87 分钟前
DDD架构演进
java·分布式·mvc·ddd
揽星河..11 分钟前
【C语言】扫雷游戏
c语言·算法·游戏
paopaokaka_luck15 分钟前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
丘山录16 分钟前
本地部署 LongCat-2.5,要 7 台机器我只有 4 台
人工智能·算法
Allen_LVyingbo21 分钟前
NVIDIA CUDA Tile 在医疗计算中的算子形式化、算法重构与内核实现
大数据·python·算法·重构·知识图谱·健康医疗·数据库架构
SL_staff23 分钟前
HR系统对接钉钉考勤总失败?根源在于缺乏业务语义级逻辑中枢
java·开源·全栈
程序边界24 分钟前
一台数据集成软件的拆解笔记(下):一致性、容错、跑批与迁移,KFS 真正难的地方在这
java·前端·笔记
揣一尾游鱼yu42 分钟前
内部类和Object笔记
java·开发语言·object·内部类
你怎么知道我是队长1 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++