《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 ...
随机推荐
- Java自定义注解校验枚举值类型参数
项目开发中会经常使用到各种枚举值,枚举值一般都是固定的,不会随意改变其中的值. 比如性别分为男女,确定之后一般都不会轻易改变,这时候使用枚举值就非常地方便.很多 时候,在页面中传入的参数就是枚举值中的 ...
- python中把列表中的字符串转成整型的几种方法
python中在不同类型数据转换方面是有标准库的,使用非常方便.但是在开发中,经常在list中字符转成整形的数据方便遇到问题.这里就记录一下常用的几种方法. 方法一:最基本的方法:通过轮训整个list ...
- Git进阶命令-revert
有关Git,之前有写过两篇文章: Git五个常见问题及解决方法 Git进阶命令-reset 一.revert命令使用场景 有一天项目经理跟你说,你开发上线的代码有问题,需要马上撤回. 撤回?你第一反应 ...
- 【VR虚拟现实】-医疗行业的具体应用
虚拟现实 (VR) 虽然经常与游戏联系在一起,但不可否认,未来科技少不了虚拟现实,其应用可以彻底改变许多行业.在医疗领域,无数人正在探索 VR 可以帮助患者和医疗从业者实现更好的治疗结果治疗方式,比如 ...
- 【LeetCode刷题】744. 寻找比目标字母大的最小字母
744. 寻找比目标字母大的最小字母(点击跳转LeetCode) 给你一个排序后的字符列表 letters ,列表中只包含小写英文字母.另给出一个目标字母 target,请你寻找在这一有序列表里比目标 ...
- 记录--alova组件使用方法(区别axios)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在我们写项目代码时,应该更加专注于业务逻辑的实现,而把定式代码交给js库或工程化自动处理,而我想说的是,请求逻辑其实也是可以继续简化的. ...
- CDC实战:MySQL实时同步数据到Elasticsearch之数组集合(array)如何处理【CDC实战系列十二】
需求背景: mysql存储的一个字段,需要同步到elasticsearch,并存储为数组,以便于查询. 如下例子,就是查询预期. PUT /t_test_1/_doc/1 { "name&q ...
- 在命令行中使用 cl.exe编译 C/C++ 程序并执行
cl.exe是Microsoft C/C++编译器. 我的VC6.0安装目录为:D:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev9 ...
- 开源相机管理库Aravis学习(一)——安装
目录 前言 Aravis简介 依赖关系说明 安装过程 meson安装 aravis源文件下载 构建和安装aravis 视频查看器 安装过程中遇到的问题 meson版本过低 CMake版本过低 缺少GS ...
- 【Java】请写出你最常见到的 5 个 runtime exception
请写出你最常见到的 5 个 runtime exception. 参考:https://blog.csdn.net/qq_20417499/article/details/80222820 Cla ...