C#中的泛型

一、泛型的概念

定义:泛型允许我们延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程

序中使用它的时候。(也就是说泛型是可以与任何数据类型一起工作的类或方法)模块内高

内聚,模块间低耦合。

泛型的使用:当我们的类/方法不需要关注调用者传递的实体是什么(公共基类工具

类),这个时候就可以使用泛型。

注意:

集合中的项允许是 object 型的值,因此可以存放任意类型的值,无法确保存入集合中

的值都是同一类型,而导致在处理时发生异常。

二、可空类型

对于引用类型的变量来说,如果未对其赋值,在默认情况下是 Null 值,对于值类型的

变量,如果未赋值,整型变量的默认值为 0。

但通过 0 判断该变量是否赋值了是不太准确的。在 C# 语言中提供了一种泛型类型

(即可空类型 (System.Nullable<T>))来解决值类型的变量在未赋值的情况下允许为 Null

的情况。

可空类型的定义:

1 System.Nullable<T> 变量名;

2 类型? 变量名;

可空类型常用方法:

属性或方法 作用

HasValue 若变量有值则为True,若为null则为False

Value 返回可空类型变量中存储的真正的值,当HasValue为True时才可以使用

举例如下:

1 class Program

2 {

3 static void Main(string[] args)

4 {

5 int? i = null;

6 double? d = 3.14;

7 if (i.HasValue)

8 {

9 Console.WriteLine("i 的值为{0}", i);

10 }

11 else

12 {

13 Console.WriteLine("i 的值为空!");

14 }

15 if (d.HasValue)

16 {

17 Console.WriteLine("d 的值为{0}", d);

18 }

19 else

20 {

21 Console.WriteLine("d 的值为空!");

22 }

23 }

24 }

三、泛型方法

在 C# 语言中泛型方法是指通过泛型来约束方法中的参数类型,也可以理解为对数据类型设

置了参数。

如果没有泛型,每次方法中的参数类型都是固定的,不能随意更改。

在使用泛型后,方法中的数据类型则有指定的泛型来约束,即可以根据提供的泛型来传递不

同类型的参数。

泛型方法的定义:

定义泛型方法需要在方法名和参数列表之间加上<>,并在其中使用 T 来代表参数类型。

注意:

C#中泛型方法中只能使用object类具有的方法。

四、泛型类

C# 语言中泛型类的定义与泛型方法类似,是在泛型类的名称后面加上<T>,当然,也可以定

义多个类型,即“<T1,T2,・・・>”

五、泛型中的数据约束

泛型中的数据约束可以指定泛型类型的范围。

若给T类型的数据约束struct,则T只能接受struct的子类类型,否则编译错误。

六、泛型集合

C# 语言中泛型集合是泛型中最常见的应用,主要用于约束集合中存放的元素。

由于在集合中能存放任意类型的值,在取值时经常会遇到数据类型转换异常的情况,因此推

荐在定义集合时使用泛型集合。

泛型集合中主要使用 List<T> 和 Dictionary<K,V> 。

1、List<T>类

List<T>类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现

IList<T> 泛型接口。

2、Dictionary<K,V>

Dictionary<K,V>是 HashTable相对应的泛型集合,其存储数据的方式与哈希表相似,通

过键/值来保存元素,并具有泛型的全部特征,编译时检查类型约束,读取时无须类型转

换。

使用约束:

从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成任何键都必须是唯一的,键不能为空引用null,若值为引用类型,则可以为空值

Key和Value可以是任何类型(string,int,class 等)

七、IComparable、IComparer自定义排序

在 C# 语言中提供了 IComparer 和 IComparable 接口比较集合中的对象值,主要用于对

集合中的元素排序。

IComparer 接口用于在一个单独的类中实现,用于比较任意两个对象。

IComparable 接口用于在要比较的对象的类中实现,可以比较任意两个对象。

在比较器中还提供了泛型接口的表示形式,即 IComparer<T> 和 IComparable<T> 的形

式。

1、 IComparable<T> 接口

要比较的自定义类型需要继承IComparable <T> 接口,并实现以下方法:

CompareTo(T obj)比较两个对象值

返回值小于0代表当前实例小于比较实例

返回值等于0代表二者相等。

返回值大于0代表当前实例大于比较实例

如果需要对集合中的元素排序,通常使用 CompareTo 方法实现

2、 IComparer <T> 接口

如果要使得自定义类型可以使用泛型集合中的Sort方法进行排序,那么可自定义一个排序

类,实现IComparer <T> 接口中的以下方法:

Compare(T obj1,T obj2)比较两个对象值

返回值小于0代表当前实例小于比较实例

返回值等于0代表二者相等。

返回值大于0代表当前实例大于比较实例

### C# 方法的使用示例及详解 #### 什么是方法? 在 C# 中,方法允许开发者定义一种可以操作多种数据类的函数。通过指定类参数 `T` 或其他自定义名称,可以在不改变逻辑的情况下处理不同类的输入和输出。这种方法提高了代码的重用性和灵活性。 以下是关于如何声明、调用以及应用方法的具体说明: --- #### 声明方法 方法可以通过在其返回值前加上 `<T>` 来表示支持。例如: ```csharp public static T GetT<T>(T a) { return a; } ``` 上述代码中,`GetT` 是一个静态方法,它接受任意类的单个参数并将其原样返回[^1]。 --- #### 调用方法 当调用方法时,编译器会尝试推断实际使用的类。如果无法自动推断,则需显式提供类参数。下面是一些具体的例子: ##### 自动类推断 ```csharp int resultInt = Helper.GetT(42); // 编译器推测 T 为 int 类 string resultString = Helper.GetT("Hello"); // 编译器推测 T 为 string 类 ``` ##### 显式指定类 ```csharp double resultDouble = Helper.GetT<double>(3.14); bool resultBool = Helper.GetT<bool>(true); ``` 在这里,即使传入的是整数常量 `3.14` 和布尔字面量 `true`,我们仍然强制指定了目标类作为双精度浮点数 (`double`) 和布尔值 (`bool`)。 --- #### 添加约束条件 (Constraints) 为了增强安全性或者实现特定功能,可能需要对中的施加某些限制。这称为 **类约束**。常见的几种约束包括但不限于以下几项: - **结构体约束**: 只能传递值类。 - **类约束**: 需要是一个引用类。 - **构造函数约束**: 表明该类必须具有无参公共构造函数。 - **基类/接口约束**: 指定某类应继承某个具体类或实现某一接口。 举个例子来说,如果我们希望我们的只适用于实现了 `IComparable` 接口的对象,那么我们可以这样写: ```csharp public static void PrintMinValue<T>(List<T> list) where T : IComparable { if (list.Count == 0){ Console.WriteLine("The list is empty."); return ; } T minValue = list[0]; foreach(T item in list){ if(item.CompareTo(minValue)<0){ minValue=item; } } Console.WriteLine($"Minimum value: {minValue}"); } ``` 此版本的方法仅限于那些能够比较大小的数据类(即实现了 `IComparable` 的类),从而避免潜在错误发生。 --- #### 实际应用场景 假设我们需要创建一个通用交换两个变量值得工具方法,它可以用于任何基本数据类甚至复杂对象之间互换位置而无需担心兼容性问题。利用前面学到的知识很容易做到这一点: ```csharp public class Utility{ public static void Swap<T>(ref T lhs, ref T rhs){ T temp=lhs; lhs=rhs; rhs=temp; } } // Usage Example: Utility.Swap<int>(ref numA ,ref numB ); Utility.Swap<string>(ref strX ,ref strY ); ``` 以上展示了如何构建灵活且强大的算法组件来满足各种需求场景下的高效开发工作流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值