c sharp 泛型详解

news/2025/2/23 7:39:04

文章目录

    • 泛型解决了什么问题?
    • 泛型概念
    • 泛型类
    • 泛型方法
    • 泛型接约束
    • 泛型的优势
    • 练习

泛型解决了什么问题?

在没有泛型时,如果我们想为不同类型(int和string)实现相同的逻辑,可能需要写多个重复的类或方法。例如,一个存储整数的容器和一个存储字符串类型的容器,他们的逻辑相同但类型不同。泛型通过类型参数化解决了这个问题——让你在定义类、方法或接口时使用占位符(比如 T)。

泛型概念

泛型允许你在定义类、接口或方法时使用类型参数。这些类型参数可以在实际使用时被指定为任何类型。常见的泛型用途包括集合类(如 List)以及方法和类的通用实现。

泛型类

个泛型类定义允许你使用类型参数

    internal class Class1<T>
    {
        private T value;

        public void SetValue(T value)
        {
            this.value = value;
        }
        public T GetValue()
        {
            return this.value;
        }
    }

T是一个类型参数,可以在创建Class1类的实例时指定具体类型,如int,string等:

            Class1<int> intClass = new Class1<int>();
            intClass.SetValue(10);
            Console.WriteLine(intClass.GetValue());

            Class1<string> stringClass = new Class1<string>();
            stringClass.SetValue("hello world");
            Console.WriteLine(stringClass.GetValue());

泛型方法

泛型方法是可以在方法定义中使用类型参数的普通方法。它与泛型类类似,但是只作用域该方法范围内的参数和返回类型

    public class Printer
    {
        public void Print<T>(T value)
        {
            Console.WriteLine(value);
        }
    }

在调用时,你可以传入任何类型:

            Printer printer = new Printer();
            printer.Print(123);
            printer.Print("liu wei");

泛型接约束

泛型接口定义了一个可以与不同类型一起使用的接口。例如,IEnumerable 接口就是泛型接口,它用于表示一个可枚举的集合:
为了让泛型更安全,可以限制类型参数 T 的允许范围。常见的约束有:

where T : struct → T 必须是值类型(如 int, double)
where T : class → T 必须是引用类型(如 string, 类)
where T : new() → T 必须有无参构造函数
where T : 接口名 → T 必须实现某个接口

只允许值类型

    public class ValueContent<T> where T : struct
    {
        private T Value { get; set; }
    }
	//正确
    ValueContent<int> valueContent = new ValueContent<int>();
    //错误
    ValueContent<string> valueContent = new ValueContent<string>();

泛型的优势

避免重复代码:只需写一次逻辑,适用于所有类型。
类型安全:不再需要强制转换(如 object 到 int)。
性能优化:避免装箱(Boxing)和拆箱(Unboxing)。

练习

    //比较两个数的大小
    public class Class2
    {
        public static T Max<T>(T a, T b) where T : IComparable<T>
        {
            return a.CompareTo(b) > 0 ? a : b;
        }
    }
     //交换两个数的变量值
     public void Swap<T>(T a,T b)
     {
         T temp = a;
         a = b;
         b = a;
     }
    public class Logger<T>
    {
        private List<string> _logs = new List<string>();
        // 记录一条日志(包含时间和类型信息)
        public void Log(T message)
        {
            string logEntry = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] [{typeof(T).Name}] {message}";
            _logs.Add(logEntry);
        }
        public void checkLog()
        {
            foreach(var log in _logs)
            {
                Console.WriteLine(log);
            }
        }
    }

        var intLogger = new Logger<int>();
        intLogger.Log(42);
        intLogger.Log(100);

        var stringLogger = new Logger<string>();
        stringLogger.Log("Error occurred");
        stringLogger.Log("Operation completed");

        intLogger.checkLog();
        stringLogger.checkLog();

[2025-02-22 11:19:07] [Int32] 42
[2025-02-22 11:19:07] [Int32] 100
[2025-02-22 11:19:07] [String] Error occurred
[2025-02-22 11:19:07] [String] Operation completed

http://www.niftyadmin.cn/n/5863178.html

相关文章

LLaMA-Factory|微调大语言模型初探索(4),64G显存微调13b模型

上篇文章记录了使用lora微调deepseek-7b&#xff0c;微调成功&#xff0c;但是微调llama3-8b显存爆炸&#xff0c;这次尝试使用qlora微调HQQ方式量化&#xff0c;微调更大参数体量的大语言模型&#xff0c;记录下来微调过程&#xff0c;仅供参考。 对过程不感兴趣的兄弟们可以直…

ROS2下编写package利用orbbec相机进行yolov8实时目标检测

视频讲解 ROS2下编写package利用orbbec相机进行yolov8实时目标检测 在《ROS2下编写orbbec相机C package并Rviz显示》的基础上&#xff0c;继续添加对获取的图像使用YOLO进行目标检测 首先安装YOLO以及相关库 pip3 install ultralytics 使用如下指令测试下yolo安装情况 yol…

anaconda不显示jupyter了?

以前下载的anaconda显示jupyter&#xff0c;但是最近学习吴恩达的机器学习视频&#xff0c;需要用到jupyter&#xff0c;以前的jupyter运行不了&#xff0c;就重新下载了一个anaconda&#xff0c;发现新版的anaconda首页不显示jupyter了&#xff0c;在查找资料之后&#xff0c;…

请说明C#中的List是如何扩容的?

在 C# 中&#xff0c;List<T>是一个动态数组&#xff0c;它会根据需要自动调整其容量以容纳更多的元素。 目录 1 扩容条件与扩容算法规则 2 总结 1 扩容条件与扩容算法规则 当你创建一个新的List<T>实例时&#xff0c;如果没有指定初始容量&#xff0c;它会使…

小智机器人CMakeLists编译文件解析

编译完成后&#xff0c;成功烧录&#xff01; 这段代码是一个CMake脚本&#xff0c;用于配置和构建一个嵌入式项目&#xff0c;特别是针对ESP32系列芯片的项目。CMake是一个跨平台的构建系统&#xff0c;用于管理项目的编译过程。 set(SOURCES "audio_codecs/audio_code…

2025前端框架最新组件解析与实战技巧:Vue与React的革新之路

作者&#xff1a;飞天大河豚 引言 2025年的前端开发领域&#xff0c;Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化&#xff0c;两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…

【C语言】第六期——数组

目录 0 前言 1 声明数组 2 初始化数组 2.1 部分初始化 3 访问数组元素 4 修改数组元素 5 计算数组长度&#xff08;size of&#xff09; 5.1 应用&#xff1a;遍历数组 6 定义使用数组时常见的错误 7 选择排序和冒泡排序&#xff08;拓展&#xff09; 7.1 选择排序 …

ChromeDriver版本不匹配问题的解决

今天运行一个以前写的爬虫程序&#xff0c;遇到如下错误&#xff1a; selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 121 Current browser version is 133.0.6943.98 w…