做网站挣外快/关键词优化是怎样收费的

做网站挣外快,关键词优化是怎样收费的,怎么做网站排名优化,平面设计真实工资C# 中的 泛型(Generics) 是一种强大的编程特性,允许开发者在不预先指定具体数据类型的情况下编写代码。通过泛型,C# 能够让我们编写更灵活、可重用、类型安全且性能优良的代码。泛型广泛应用于类、方法、接口、委托、集合等多个方…

C# 中的 泛型(Generics) 是一种强大的编程特性,允许开发者在不预先指定具体数据类型的情况下编写代码。通过泛型,C# 能够让我们编写更灵活、可重用、类型安全且性能优良的代码。泛型广泛应用于类、方法、接口、委托、集合等多个方面。

本文将详细介绍 C# 中泛型的基本概念、常见用法、类型约束以及一些高级应用,帮助你更深入地理解泛型的强大功能及其最佳实践。


一、泛型的基本概念

1.1 什么是泛型?

泛型使得你能够编写能够操作多种数据类型的代码,而不需要在代码中硬编码具体的数据类型。通过类型参数(例如 T),你可以在运行时决定具体的类型,从而提高代码的重用性和灵活性。

在 C# 中,泛型可以应用于:

  • 泛型类
  • 泛型方法
  • 泛型接口
  • 泛型委托
  • 泛型集合
1.2 泛型类

泛型类 是在定义类时使用类型参数,并且在类的实例化时指定具体的类型。这使得同一个类可以用来处理不同类型的数据。

示例:

public class Box<T>
{private T _value;public void SetValue(T value){_value = value;}public T GetValue(){return _value;}
}public class Program
{public static void Main(){Box<int> intBox = new Box<int>();intBox.SetValue(123);Console.WriteLine(intBox.GetValue());  // 输出 123Box<string> stringBox = new Box<string>();stringBox.SetValue("Hello");Console.WriteLine(stringBox.GetValue());  // 输出 Hello}
}

在这个例子中,Box<T> 是一个泛型类,T 是类型参数。通过不同的类型参数,Box 类可以同时处理不同的数据类型。

1.3 泛型方法

泛型方法 允许你在方法定义时使用类型参数。方法可以在调用时决定具体的类型。

示例:

public class Program
{public static void Print<T>(T value){Console.WriteLine(value);}public static void Main(){Print(123);      // 输出 123Print("Hello");  // 输出 HelloPrint(3.14);     // 输出 3.14}
}

Print<T> 方法能够处理不同类型的数据,并且在调用时根据传入的参数类型来自动推断 T 的类型。

1.4 泛型接口

泛型接口 允许接口声明时不指定具体的类型,而是在实现该接口的类中指定具体类型。通过这种方式,接口可以与多种数据类型兼容。

示例:

public interface IStorage<T>
{void Add(T item);T Get(int index);
}public class StringStorage : IStorage<string>
{private List<string> items = new List<string>();public void Add(string item){items.Add(item);}public string Get(int index){return items[index];}
}public class Program
{public static void Main(){IStorage<string> storage = new StringStorage();storage.Add("Item 1");storage.Add("Item 2");Console.WriteLine(storage.Get(0));  // 输出 Item 1}
}

在这个例子中,IStorage<T> 是一个泛型接口,StringStorage 类实现了该接口,并且指定 Tstring 类型。


二、泛型类型参数的约束

C# 允许你为泛型类型参数添加约束,以确保泛型在特定类型范围内使用,从而提升类型安全性。

2.1 常见的泛型约束
  • class:限制类型参数为引用类型。
  • struct:限制类型参数为值类型。
  • new():限制类型参数必须有无参数构造函数。
  • where T : BaseClass:限制类型参数为某个特定的类或接口。
2.2 约束示例

示例1:限制类型为值类型

public class ValueTypeContainer<T> where T : struct
{private T _value;public ValueTypeContainer(T value){_value = value;}public void Display(){Console.WriteLine(_value);}
}public class Program
{public static void Main(){ValueTypeContainer<int> intContainer = new ValueTypeContainer<int>(123);intContainer.Display();  // 输出 123// 编译错误:不能传递引用类型// ValueTypeContainer<string> stringContainer = new ValueTypeContainer<string>("Hello");}
}

示例2:使用接口约束

public interface IComparable
{int CompareTo(object obj);
}public class Repository<T> where T : IComparable
{public void Print(T item){Console.WriteLine(item.ToString());}
}public class Program
{public static void Main(){Repository<string> repo = new Repository<string>();repo.Print("Hello");  // 输出 Hello}
}
2.3 多个约束的使用

你可以为一个泛型类型参数指定多个约束,确保泛型类型满足多个条件。

示例:

public class Repository<T> where T : class, IComparable, new()
{public void Print(T item){Console.WriteLine(item.ToString());}
}

三、泛型的高级用法

3.1 多个类型参数

泛型不仅支持一个类型参数,还可以支持多个类型参数,这使得你可以创建更加灵活的泛型类型。

示例:

public class Pair<T1, T2>
{private T1 first;private T2 second;public Pair(T1 first, T2 second){this.first = first;this.second = second;}public void Print(){Console.WriteLine($"First: {first}, Second: {second}");}
}public class Program
{public static void Main(){Pair<int, string> pair = new Pair<int, string>(1, "One");pair.Print();  // 输出 First: 1, Second: One}
}
3.2 泛型与集合类

C# 的泛型集合类(如 List<T>Dictionary<TKey, TValue>Queue<T> 等)允许我们高效地操作数据,并且避免了类型转换的潜在问题。

示例:

List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
Console.WriteLine(numbers[0]);  // 输出 1
3.3 泛型委托

泛型委托使得委托能够处理多种类型的方法。你可以定义一个泛型委托,使其接受不同类型的参数,并且在运行时动态选择具体的方法。

示例:

public delegate void PrintDelegate<T>(T value);public class Program
{public static void Main(){PrintDelegate<int> printInt = (value) => Console.WriteLine(value);printInt(10);  // 输出 10PrintDelegate<string> printString = (value) => Console.WriteLine(value);printString("Hello");  // 输出 Hello}
}
3.4 泛型与 LINQ

C# 的 LINQ 查询使用泛型来确保查询结果的类型安全。你可以利用 LINQ 对集合进行高效的查询、排序和过滤操作。

示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();foreach (var num in evenNumbers)
{Console.WriteLine(num);  // 输出 2, 4
}

四、泛型的优势

  1. 类型安全:泛型提供编译时的类型检查,避免了运行时类型错误。
  2. 性能优化:泛型避免了类型转换的开销,因此在处理大量数据时具有较好的性能。
  3. 代码重用:通过泛型,我们可以编写能够处理多种类型数据的代码,而无需重复编写多个版本。
  4. 灵活性:泛型使得我们能够编写通用的代码,且不需要牺牲类型安全。

五、总结

泛型是 C# 中的一项强大特性,能够让你编写类型安全、灵活、可重用且高效的代码。通过泛型,开发者可以避免在类型转换时出现的错误,并且能够编写高度通用的类、方法、接口等。掌握泛型的使用,能够帮助开发者在处理复杂数据结构和编写高效代码时更得心应手。

无论是常见的泛型类、方法、接口,还是泛型在 LINQ 和集合类中的应用,了解泛型的各种用法和最佳实践,能够使你写出更简洁、更可维护的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5DS编辑器是如何让企业快速构建动态页面

H5DS编辑器核心亮点&#xff1a; 1.拖拽式操作&#xff0c;小白友好&#xff1a;无需设计与代码基础&#xff01;通过简单拖拽元素、调整文字和动画&#xff0c;即可生成交互式H5页面。内置海量模板和素材库&#xff0c;支持自定义设计风格&#xff0c;轻松适配企业品牌需求。…

[项目]基于FreeRTOS的STM32四轴飞行器: 三.电源控制

基于FreeRTOS的STM32四轴飞行器: 三.电源控制 一.IP5305T芯片手册二.电源控制任务 一.IP5305T芯片手册 注意该芯片低功耗特性&#xff0c;为防止进入待机&#xff0c;每隔一段时间发送一个电平。 官方提供的芯片外围电路设计图&#xff1a; 电气特性&#xff1a; 当负载电流持…

java环境部署

java环境部署 一、准备工作 jrejdkeclipse jdk下载&#xff1a;21和1.8-----官网&#xff1a;Oracle&#xff1a;Java 下载 |神谕 该处选择要依据自身的系统类型选择下载 idea的下载安装&#xff1a;IntelliJ IDEA | Other Versions 二、安装 三、环境配置 四、使用 五、i…

C 语言数据结构(一):时/空间复制度

目录 一、前言 1. 什么是数据结构 2. 什么是算法 二、时 / 空间复杂度 1. 算法效率 2. 时间复杂度 2.1 时间复杂度的概念 2.2 大 O 的渐进表示法 2.3 常见的计算时间复杂度的例子 2.3.1 实例 1 2.3.2 实例 2 2.3.3 实例 3 2.3.4 实例 4 2.3.5 实例 5 &#xff1a…

23种设计模式一览【设计模式】

文章目录 前言一、创建型模式&#xff08;Creational Patterns&#xff09;二、结构型模式&#xff08;Structural Patterns&#xff09;三、行为型模式&#xff08;Behavioral Patterns&#xff09; 前言 设计模式是软件工程中用来解决特定问题的一组解决方案。它们是经过验证…

Beyond Compare for mac v5.0.6.30713 文件对比利器 支持M、Intel芯片

Mac毒搜集到的Beyond Compare是一套超级的文件及文件夹(目录)的比较工具&#xff0c;不仅可以快速比较出两个目录的不同&#xff0c;还可以比较每个文件的内容&#xff0c;而且可以任意显示比较结果。 应用介绍 程序内建了文件浏览器&#xff0c;方便您对文件、文件夹、压缩包…

ProfibusDP主站转ModbusTCP网关如何进行数据互换

ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域&#xff0c;通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准&#xff0c;广泛应用于工业控制网络中&#xff1b;而Modbus TCP作为基于以太网的通信协议&#xff0c;因其简单易…

【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…

数据结构秘籍(四) 堆 (详细包含用途、分类、存储、操作等)

1 引言 什么是堆&#xff1f; 堆是一种满足以下条件的树&#xff1a;&#xff08;树这一篇可以参考我的文章数据结构秘籍&#xff08;三&#xff09;树 &#xff08;含二叉树的分类、存储和定义&#xff09;-CSDN博客&#xff09; 堆中的每一个结点值都大于等于&#xff08…

服务器数据恢复—raid5阵列中硬盘掉线导致上层应用不可用的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某公司一台服务器&#xff0c;服务器上有一组由8块硬盘组建的raid5磁盘阵列。 磁盘阵列中2块硬盘的指示灯显示异常&#xff0c;其他硬盘指示灯显示正常。上层应用不可用。 服务器数据恢复过程&#xff1a; 1、将服务器中所有硬盘编号…

全网独家:zabbixV7版本容器服务器无法访问Postgres V17数据库的问题解决

近期将zabbix平台从V6.2.6升级到7.2.4&#xff0c;遇到问题“PostgresoL server is not available. Waiting 5seconds”&#xff0c;容器无法访问Postgres V17数据库&#xff0c;本文记录问题解决过程。 一、系统环境 1、数据库版本 数据库版本&#xff1a;postgres-17.4-tim…

进程控制 ─── linux第15课

目录 进程控制 1.进程创建 (fork前面讲过了) 写时拷贝 进程终止 进程退出场景 退出码 进程终止方法 进程控制 1.进程创建 (fork前面讲过了) 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父…

Hive-07之企业级调优

⭐️⭐️⭐️⭐️hive的企业级调优 1、Fetch抓取 Fetch抓取是指&#xff0c;Hive中对某些情况的查询可以不必使用MapReduce计算 例如&#xff1a;select * from score;在这种情况下&#xff0c;Hive可以简单地读取employee对应的存储目录下的文件&#xff0c;然后输出查询结果…

华为云 | 快速搭建DeepSeek推理系统

DeepSeek&#xff08;深度求索&#xff09;作为一款国产AI大模型&#xff0c;凭借其高性能、低成本和多模态融合能力&#xff0c;在人工智能领域崛起&#xff0c;并在多个行业中展现出广泛的应用潜力。 如上所示&#xff0c;在华为云解决方案实践中&#xff0c;华为云提供的快速…

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…

3月5日作业

代码作业&#xff1a; #!/bin/bash# 清空目录函数 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "检测到 $name 目录已存在&#xff0c;请选择操作&#xff1a; 1) 清空目录内容 2) 保留目…

达梦数据库关于参数PK_WITH_CLUSTER的改动分析

目录 1、PK_WITH_CLUSTER取值为0 2、PK_WITH_CLUSTER取值为1 达梦数据库的参数PK_WITH_CLUSTER在最近使用过程中发现与前期使用的版本存在差异&#xff0c;特此测试分析一下。具体哪个版本改动的暂未得知。 PK_WITH_CLUSTER&#xff0c;默认值为0&#xff0c;动态会话级参数。…

android11使用gpio口控制led状态灯

目录 一、简介 二、解决方法 A、底层驱动 B、上层调用 C、验证 一、简介 1、需求&#xff1a;这里是用2个gpio口来控制LED灯&#xff0c;开机时默认亮蓝灯&#xff0c;按开机键&#xff0c;休眠亮红灯&#xff0c;唤醒亮蓝灯。 原理图&#xff1a; 这里由于主板上电阻R63…

windows 利用nvm 管理node.js 2025最新版

1.首先在下载nvm 下载链接 2. 下载最新版本的nvm 3. 同意协议 注意&#xff1a;选择安装路径 之后一直下一步即可 可以取消勾选 open with Powershell 勾选后它会自动打开Powershell 这里选用cmd 输入以下命令查看是否安装成功 nvm version 查看已经安装的版本 我之前自…

MySQL ——数据的增删改查

一、DML语言 1.1 insert插入数据 语法&#xff1a;insert [into] 表名 [字段名] values(值列表)&#xff1b; 插入一行数据 第一种&#xff1a;insert into file1(id,name,age) values (1,‘aa’,11); 第二种&#xff1a;insert into file1 values(1,‘aa’,11); 插入多行数…