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>());
    }
    
}
相关推荐
苹果酱05674 分钟前
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
java·vue.js·spring boot·mysql·课程设计
Java致死27 分钟前
单例设计模式
java·单例模式·设计模式
mit6.82429 分钟前
[Lc_week] 447 | 155 | Q1 | hash | pair {}调用
算法·leetcode·哈希算法·散列表
胡子发芽31 分钟前
请详细解释Java中的线程池(ThreadPoolExecutor)的工作原理,并说明如何自定义线程池的拒绝策略
java
沫夕残雪36 分钟前
Tomcat的安装与配置
java·tomcat
胡子发芽1 小时前
请解释Java中的NIO(New I/O)与传统I/O的区别,并说明NIO中的关键组件及其作用
java
柚个朵朵1 小时前
IDEA中使用Git
java·git·spring
jerry6092 小时前
优先队列、堆笔记(算法第四版)
java·笔记·算法
666HZ6662 小时前
关于IDEA的循环依赖问题
java·ide·intellij-idea
勤劳的牛马2 小时前
📚 小白学算法 | 每日一题 | 算法实战:加1!
算法