《c#高级编程》第2章C#2.0中的更改(一)——泛型
一、实例
当我们需要编写一些通用的代码,但是不确定它们将处理的数据类型时,泛型就非常有用了。下面是一个简单的 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中的更改(一)——泛型的更多相关文章
- javascript高级编程3第二章:在html中使用javascript
2.1 <script>元素 向html页面中插入javascript的主要方法,就是使用<script>元素.这个元素被加入到正式的html规范中.html4.01为< ...
- ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法
参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...
- ASP.NET MVC5 高级编程 第3章 视图
参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...
- ASP.NET MVC5 高级编程 第2章 控制器
参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...
- UNIX环境高级编程 第8章 进程控制
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...
- 【读书笔记】C#高级编程 第五章 泛型
(一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的 ...
- 第四章 在MVC4.0中对脚本以及样式表的引用变化
原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用“~”,而无需使用Href对象 ...
- C#高级编程第1章-.NET体系结构
内容提要: (1)编译和运行面向对象.NET代码 (2)IL/MSIL(Microsoft Intermediate Language)中间语言的优点 (3)值类型与引用类型 (4)数据类型化 (5) ...
- C#高级编程第2章-核心C#
内容提要: 声明变量:变量的初始化和作用域:C#的预定义数据类型:在C#程序中使用条件语句.循环和跳转语句指定执行流:枚举:名称空间: Main()方法:基本命令行C#编译器选项:使用System.C ...
- UNIX环境高级编程 第13章 守护进程
守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...
随机推荐
- 浅谈Zabbix与Prometheus区别
Zabbix和Prometheus都是非常流行的监控系统.它们有许多相似之处,但也有一些不同之处.以下是Zabbix和Prometheus监控对比的一些关键点: 1.数据模型和查询语言 Prometh ...
- FreeRTOS教程4 消息队列
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...
- CSS Flex 弹性布局使用
原文地址:CSS Flex 弹性布局使用 | Stars-One的杂货小窝 前端钻研不深,本文只是稍微记录一下关于Flex布局的知识,讲得不深,需要深入了解学习的可以参考其他大佬的博客 重点记录 通过 ...
- day02-SpringMVC映射请求数据
SpringMVC映射请求数据 1.获取参数值 在开发中,如何获取到 http://xxx/url?参数名1=参数值1&参数名2=参数值2 中的参数? 之前的案例中我们知道:提交的url的参数 ...
- eclipse错误之Could not write metadata for "xxx"
Could not write metadata for '/test'. 这是由于删除一个项目时,没有同时在硬盘上删除该项目,而后又到硬盘文件系统中删除了该项目,才出现这问题的. 到eclipse工 ...
- 云流化:XR扩展现实应用发展道路上的新方向
扩展现实的发展已经改变了我们工作.生活和娱乐的方式,而且这才刚刚开始.扩展现实 (Extended reality, XR) 涵盖了沉浸式技术,包括虚拟现实.增强现实和混合现实.从游戏到虚拟制作再到产 ...
- python面向对象(绑定方法与非绑定方法)
# 一.绑定方法:特殊之处在于将调用者本身当做第一个参数自动传入 # 1)绑定给对象的方法:调用者是对象,自动传入的是对象 # 2)绑定给类的方法:调用者是类,自动传入的是类 # 类方法的应用 # 需 ...
- ProtoBuf-gRPC实践
目录介绍 01.gRPC学习背景 1.1 为什么要学RPC 1.2 RPC是什么 1.3 网络库收益分析 1.4 学习计划说明 1.5 学习问题思考 02.ProtoBuf的介绍 2.1 ProtoB ...
- CoordinatorLayout滑动抖动问题
目录介绍 01.CoordinatorLayout滑动抖动问题描述 02.滑动抖动问题分析 03.自定义AppBarLayout.Behavior说明 04.CoordinatorLayout滑动抖动 ...
- View事件机制分析
目录介绍 01.Android中事件分发顺序 1.1 事件分发的对象是谁 1.2 事件分发的本质 1.3 事件在哪些对象间进行传递 1.4 事件分发过程涉及方法 1.5 Android中事件分发顺序 ...