一、实例

当我们需要编写一些通用的代码,但是不确定它们将处理的数据类型时,泛型就非常有用了。下面是一个简单的 C# 泛型示例:

using System;

public class Example
{
public static void Main()
{
// 定义一个 int 数组
int[] ints = { 1, 2, 3, 4, 5 }; // 输出数组的所有元素
Console.WriteLine("Integers:");
PrintArray(ints); // 定义一个 string 数组
string[] strings = { "hello", "world", "!" }; // 输出数组的所有元素
Console.WriteLine("\nStrings:");
PrintArray(strings);
} // 使用泛型方法输出数组的所有元素
public static void PrintArray<T>(T[] array)
{
foreach (T element in array)
{
Console.Write("{0} ", element);
}
Console.WriteLine();
}
}

这个示例展示了泛型的核心思想 - 通过使用类型参数来实现通用性。使用泛型,我们可以编写一次性代码,以处理多种类型的数据,并且不必对每种数据类型都编写一份独立的代码。

总之,C# 泛型是一种非常强大的特性,它提高了代码的通用性和可重用性,同时避免了装箱和拆箱的性能损失。

二、基本原理

当我们定义一个泛型类或方法时,编译器会生成两个相关的实体 - 泛型类型和泛型方法。泛型类型用于描述包含类型参数的类型,而泛型方法则用于描述包含类型参数的方法。

在运行时,C# 的实现机制采用了类型擦除的策略。具体来说,在泛型类型和泛型方法被调用时,CLR(Common Language Runtime)会将其中的类型参数替换为实际的类型,并对其进行检查和转换操作。这个过程称为类型擦除。

例如,如果我们定义了以下泛型 List<T> 类:

```
class List<T>
{
private T[] array;

public List()
{
array = new T[10];
}

public void Add(T item)
{
// ...
}
}
```

那么在编译期间,编译器会生成一个非泛型类,它与上面的泛型类相似,但是使用 object 类型替换了 T 类型:

```
class List
{
private object[] array;

public List()
{
array = new object[10];
}

public void Add(object item)
{
// ...
}
}
```

当我们创建一个 List<int> 实例并调用 Add 方法时,CLR 会将类型参数 int 替换为实际的类型,并执行必要的类型检查和转换操作,然后执行相应的代码。

这个过程确保了泛型代码在运行时能够像普通代码一样执行,同时避免了代码重复。由于泛型类型和泛型方法只需要编译一次,因此它们在性能方面具有优势,并且不会占用额外的存储空间。

希望这个解释能够让你更好地理解 C# 泛型的实现过程。

《c#高级编程》第2章C#2.0中的更改(一)——泛型的更多相关文章

  1. javascript高级编程3第二章:在html中使用javascript

    2.1 <script>元素 向html页面中插入javascript的主要方法,就是使用<script>元素.这个元素被加入到正式的html规范中.html4.01为< ...

  2. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...

  3. ASP.NET MVC5 高级编程 第3章 视图

    参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...

  4. ASP.NET MVC5 高级编程 第2章 控制器

    参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...

  5. UNIX环境高级编程 第8章 进程控制

    本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...

  6. 【读书笔记】C#高级编程 第五章 泛型

    (一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的 ...

  7. 第四章 在MVC4.0中对脚本以及样式表的引用变化

    原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用“~”,而无需使用Href对象 ...

  8. C#高级编程第1章-.NET体系结构

    内容提要: (1)编译和运行面向对象.NET代码 (2)IL/MSIL(Microsoft Intermediate Language)中间语言的优点 (3)值类型与引用类型 (4)数据类型化 (5) ...

  9. C#高级编程第2章-核心C#

    内容提要: 声明变量:变量的初始化和作用域:C#的预定义数据类型:在C#程序中使用条件语句.循环和跳转语句指定执行流:枚举:名称空间: Main()方法:基本命令行C#编译器选项:使用System.C ...

  10. UNIX环境高级编程 第13章 守护进程

    守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...

随机推荐

  1. 浅谈Zabbix与Prometheus区别

    Zabbix和Prometheus都是非常流行的监控系统.它们有许多相似之处,但也有一些不同之处.以下是Zabbix和Prometheus监控对比的一些关键点: 1.数据模型和查询语言 Prometh ...

  2. FreeRTOS教程4 消息队列

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...

  3. CSS Flex 弹性布局使用

    原文地址:CSS Flex 弹性布局使用 | Stars-One的杂货小窝 前端钻研不深,本文只是稍微记录一下关于Flex布局的知识,讲得不深,需要深入了解学习的可以参考其他大佬的博客 重点记录 通过 ...

  4. day02-SpringMVC映射请求数据

    SpringMVC映射请求数据 1.获取参数值 在开发中,如何获取到 http://xxx/url?参数名1=参数值1&参数名2=参数值2 中的参数? 之前的案例中我们知道:提交的url的参数 ...

  5. eclipse错误之Could not write metadata for "xxx"

    Could not write metadata for '/test'. 这是由于删除一个项目时,没有同时在硬盘上删除该项目,而后又到硬盘文件系统中删除了该项目,才出现这问题的. 到eclipse工 ...

  6. 云流化:XR扩展现实应用发展道路上的新方向

    扩展现实的发展已经改变了我们工作.生活和娱乐的方式,而且这才刚刚开始.扩展现实 (Extended reality, XR) 涵盖了沉浸式技术,包括虚拟现实.增强现实和混合现实.从游戏到虚拟制作再到产 ...

  7. python面向对象(绑定方法与非绑定方法)

    # 一.绑定方法:特殊之处在于将调用者本身当做第一个参数自动传入 # 1)绑定给对象的方法:调用者是对象,自动传入的是对象 # 2)绑定给类的方法:调用者是类,自动传入的是类 # 类方法的应用 # 需 ...

  8. ProtoBuf-gRPC实践

    目录介绍 01.gRPC学习背景 1.1 为什么要学RPC 1.2 RPC是什么 1.3 网络库收益分析 1.4 学习计划说明 1.5 学习问题思考 02.ProtoBuf的介绍 2.1 ProtoB ...

  9. CoordinatorLayout滑动抖动问题

    目录介绍 01.CoordinatorLayout滑动抖动问题描述 02.滑动抖动问题分析 03.自定义AppBarLayout.Behavior说明 04.CoordinatorLayout滑动抖动 ...

  10. View事件机制分析

    目录介绍 01.Android中事件分发顺序 1.1 事件分发的对象是谁 1.2 事件分发的本质 1.3 事件在哪些对象间进行传递 1.4 事件分发过程涉及方法 1.5 Android中事件分发顺序 ...