首页 > 其他分享 >泛型

泛型

时间:2024-03-07 14:59:47浏览次数:8  
标签:max 代码 类型 泛型 array public

简介

C# 中的泛型是一种强大的特性,允许你编写可重用的代码,而不必为不同的数据类型编写多个版本。通过泛型,你可以创建类、方法和接口,以便它们可以在编译时指定具体的数据类型。这使得代码更加灵活、类型安全,并且可以提高性能。

案例

泛型允许我们编写代码时指定类型参数,以便在运行时使用不同的实际类型。假设我们有一个简单的需求:实现一个数组的查找最大值功能。我们可以比较使用泛型前后的实现

不使用泛型

public class NonGenericMaxFinder
{
    public int FindMaxInt(int[] array)
    {
        if (array == null || array.Length == 0)
            throw new ArgumentException("Array cannot be null or empty.");

        int max = array[0];
        foreach (int num in array)
        {
            if (num > max)
                max = num;
        }
        return max;
    }

    public double FindMaxDouble(double[] array)
    {
        if (array == null || array.Length == 0)
            throw new ArgumentException("Array cannot be null or empty.");

        double max = array[0];
        foreach (double num in array)
        {
            if (num > max)
                max = num;
        }
        return max;
    }

    // More methods for other types if needed...
}

使用泛型

public class GenericMaxFinder<T> where T : IComparable<T>
{
    public T FindMax(T[] array)
    {
        if (array == null || array.Length == 0)
            throw new ArgumentException("Array cannot be null or empty.");

        T max = array[0];
        foreach (T item in array)
        {
            if (item.CompareTo(max) > 0)
                max = item;
        }
        return max;
    }
}

在这个例子中,GenericMaxClass<T>是一个泛型类,其中的T是类型参数。在实例化时,您可以指定T的具体类型。使用泛型后,我们只需要一个通用的方法来处理各种类型的数组,而不需要为每种类型编写单独的方法,这使得代码更加简洁。

泛型约束

泛型约束允许对泛型类型参数进行更严格的限制。例如,可以使用where子句来指定类型参数必须是特定类型、必须实现特定接口或必须具有无参构造函数等。以下是一个示例:

public class GenericClass<T> where T : IComparable
{
    // 泛型类体
}

在这个示例中,T必须实现IComparable接口。还可以使用where T : struct来指定T必须是值类型。

泛型方法

除了泛型类之外,C#还支持泛型方法。这使得可以在方法级别使用泛型。以下是一个示例:

public class GenericMethodExample
{
    public T Max<T>(T first, T second) where T : IComparable
    {
        return first.CompareTo(second) >= 0 ? first : second;
    }
}

在这个示例中,Max方法是一个泛型方法,它接受两个参数并返回较大的那个。T被约束为实现IComparable接口的类型。

泛型委托

C#中的委托也可以是泛型的,这使得可以定义可重用的委托类型,而不必为每种类型都定义一个新的委托类型。以下是一个示例:

public delegate T Transformer<T>(T arg);

这里,Transformer<T>是一个泛型委托,它接受一个类型为T的参数并返回相同类型的结果。

三大特性

1. 类型安全性(Type Safety)

泛型提供了在编译时进行类型检查的机制,这意味着可以在编译时捕获类型不匹配的错误。使用泛型,可以在编写代码时指定类型参数,并且编译器会确保在使用这些参数时类型的一致性。这有助于防止在运行时出现类型转换错误或无效操作,提高了代码的可靠性和安全性。

2. 代码重用性(Code Reusability)

泛型允许编写可重用的通用代码,这意味着可以编写一次代码,然后在不同的数据类型上重复使用它。通过泛型,可以创建适用于多种类型的类、方法、接口和委托等组件,而不必针对每种类型都编写单独的代码。这样可以减少代码重复,提高了代码的可维护性和可扩展性。

3. 性能优化(Performance Optimization)

泛型在一定程度上可以提高代码的性能。由于泛型在编译时生成特定类型的代码,避免了装箱(boxing)和拆箱(unboxing)操作,从而减少了在运行时的性能开销。此外,泛型还可以减少由于类型转换和运行时类型检查而产生的额外开销。因此,泛型在某些情况下可以提高代码的执行效率。

 

标签:max,代码,类型,泛型,array,public
From: https://www.cnblogs.com/mchao/p/18058832

相关文章

  • JAVA API:ArrayList(泛型类)基本使用
    ArrayList代表的是一种集合,一种容器,类似于数组。 容器主要操作:增删改查   packagecom.itheima.ArrayList;importjava.util.ArrayList;importjava.util.List;publicclassdemo{publicstaticvoidmain(String[]args){ArrayListlist=new......
  • 43泛型算法和绑定器
    泛型算法和绑定器泛型算法是STL库里面定义的一些算法,这些算法可以用一个接口操作各种数据类型,因此称为泛型算法。#include<algorithm>泛型算法接受的都是迭代器,这是为了统一形式同时可以额外接受函数对象,更改泛型算法的功能绑定器当需要一个一元函数对象,但需要使用一......
  • 精简实现、线程安全:C#通用单例泛型基类助你轻松创建单例模式
     概述:该通用单例泛型基类使用C#实现,线程安全,通过泛型参数和Lazy<T>实现简化的单例模式。优点包括线程安全、泛型通用性、简化实现、以及延迟加载的特性。优点:线程安全: 使用Lazy<T>确保了线程安全的延迟初始化,避免了在多线程环境下可能导致的竞态条件问题。泛型通用性: 通......
  • 07. 泛型事件框架
    事件监听和发布我们要实现这样一个功能,当玩家在Map场景中点击一个图标的时候,需要发送事件给场景管理器,场景管理器监听事件,然后执行切换场景的操作在勇士传说中,我们使用ScriptableObject.UnityAction发布事件,以及监听事件,那时候每种类型都有一个ScriptableObject,非常繁琐。......
  • 深入浅出Go语言:泛型入门指南
    深入浅出Go语言:泛型入门指南原创 麻凡 麻凡 2024-03-0109:00 湖南 听全文随着Go1.18版本的发布,泛型正式成为了Go语言的一部分。泛型为Go开发者带来了更强大的类型抽象能力,允许我们编写更加灵活和可复用的代码。本文将带你了解Go泛型的基础知识,让你快速上手这一新特......
  • 【STL和泛型编程】4. hashtable、unordered_set、unordered_map
    1.hashtable前置知识:【数据结构】3.跳表和散列 基本原理:将Key计算成一个数值,然后取余数得到它在表头中的位置table(篮子)里每个指针都指向一个链表(桶)来存储余数相同的值如果桶内的元素个数比篮子个数还多,则将篮子的大小扩充篮子是vector,数量是质数,初始为53,53扩充后为97......
  • 【STL和泛型编程】3. set、map分析(及typename起源)
    前置知识:红黑树原理 【数据结构】7.平衡搜索树(AVL树和红黑树),红黑树的平衡性有利于search和insert红黑树的迭代器begin()左侧end()右侧迭代顺序56781011121315不能使用迭代器修改Key的值,例如将6改成50会破坏红黑树的性质1.RB-tree在g++编译......
  • Rust的ToOwned特征:泛型版的Clone
    std::borrow::ToOwned是Rust标准库中的一个特征,用于从借用的数据中创建一个具有所有权的副本。它的作用和Clone是一样的,但是相比Clone,它支持泛型;也就是说我们可以将一个类型T“Clone”为另一个类型U。这对处理一些特殊的类型来说很有用。ToOwned的签名ToOwned提供了两个方法,其中......
  • 泛型
    泛型的理解和好处看一个需求请编写程序,在ArrayList中,添加3个Dog对象Dog对象含有name和age,并输出name和age(要求使用getXxx0)先使用传统的方法来解决->引出泛型classDog{publicStringname;publicintage;publicDog(Stringname,intage){......
  • 泛型
     1.介绍泛型(Generics):是Java语言中一项重要特性,允许在类、接口和方法中使用参数化类型。通过泛型,可以编程通用、灵活的代码。提高代码的重用性和类型安全性。泛型是JavaSE1.5的新特性,是一种不确定的数据类型,这种不确定的数据类型需要我们在使用这个类的时候它才能够......