当前位置: 首页 > news >正文

C#常见的.Net类型(二)

目录

  • 一、在集合中存储多个对象
    • 理解集合的选择
      • 1.列表
      • 2.字典
      • 3.堆栈
      • 4.队列
      • 5.集
  • 二、使用Span、索引和范围
    • Span
    • 索引
    • 范围
  • 处理类型和属性
    • 1.特性
    • 2.创建自定义特性
    • 3.反射

一、在集合中存储多个对象

处理集合的常见类型

类型描述
List动态大小的数组,可以按索引访问
Dictionary<TKey, TValue>键值对集合,根据键进行快速查找
Queue先进先出的队列集合
Stack后进先出的栈集合
HashSet不包含重复元素的集合
LinkedList双向链表集合

理解集合的选择

1.列表

C#中的列表(List)是一种动态数组,可以根据需要自动调整大小。它允许按索引访问、添加、删除和搜索元素。列表提供了丰富的方法和功能,使得对集合进行操作变得更加简单和高效。 Lists 提供了泛型支持,因此你可以创建包含任意类型元素的列表。

using System;
using System.Collections.Generic;class Program
{static void Main(){// 使用 List<T>List<int> numbers = new List<int>();numbers.Add(1);numbers.Add(2);numbers.Add(3);foreach (int number in numbers){Console.WriteLine(number);}}
}

2.字典

C#中的字典(Dictionary)是一种键值对集合,其中每个键都必须是唯一的。字典提供了快速的键查找功能,可以根据键获取对应的值。字典也是动态大小的,可以根据需要自动调整大小。通过泛型支持,字典可以存储任意类型的键和值。字典提供了丰富的方法和功能,如添加、移除和检索键值对等操作,使得对键值对数据进行管理变得更加方便和高效。

using System;
using System.Collections.Generic;class Program
{static void Main(){// 使用 Dictionary<TKey, TValue>Dictionary<string, string> capitals = new Dictionary<string, string>();capitals.Add("Japan", "Tokyo");capitals.Add("France", "Paris");capitals.Add("Italy", "Rome");foreach (var country in capitals){Console.WriteLine($"The capital of {country.Key} is {country.Value}");}}
}

3.堆栈

C#中的堆栈(Stack)是一种后进先出(LIFO)的数据结构,类似于现实生活中的堆放物品的方式。在堆栈中,最后一个添加的元素将被最先移除。堆栈提供了 Push 方法用于向堆栈顶部添加元素,以及 Pop 方法用于移除并返回顶部的元素。此外,你还可以使用 Peek 方法查看但不移除顶部的元素。堆栈通常用于需要按照特定顺序处理数据的场景,例如计算表达式、撤销操作等。在C#中,你可以使用 System.Collections.Generic 命名空间中的 Stack 类来实现堆栈数据结构。

4.队列

C#中的队列(Queue)是一种先进先出(FIFO)的数据结构,类似于排队等候的方式。在队列中,最先添加的元素将会被最先移除。队列提供了 Enqueue 方法用于向队列尾部添加元素,以及 Dequeue 方法用于移除并返回队列头部的元素。此外,你还可以使用 Peek 方法查看但不移除队列头部的元素。队列通常用于需要按照特定顺序处理数据的场景,例如任务调度、消息传递等。在C#中,你可以使用 System.Collections.Generic 命名空间中的 Queue 类来实现队列数据结构。

5.集

在C#中,“集”通常指的是集合(collection),它是一种用于存储和操作多个元素的数据结构。C#中提供了许多不同类型的集合,如 List、Dictionary、Queue 和 Stack 等,每种集合类型都具有特定的行为和用途。这些集合类型可以帮助开发者更有效地组织和处理数据,以及实现各种算法和数据结构。

二、使用Span、索引和范围

Span

Span 结构表示内存中的一段连续元素,可以用于高效地操作数组的子集而无需复制数据。在示例中,我们创建了一个 Span 对象,然后使用 Slice 方法从索引 2 开始截取长度为 3 的片段,并遍历输出其中的元素。

// 使用 Span
Span<int> numbers = new int[] { 1, 2, 3, 4, 5 };
Span<int> slice = numbers.Slice(2, 3);
foreach (var number in slice)
{Console.WriteLine(number);
}

索引

C# 8 引入了索引特性,^n 表示倒数第 n 个索引。在示例中,我们使用索引特性获取了数组倒数第三个位置的元素并进行输出。

// 索引
int[] array = { 1, 2, 3, 4, 5 };
Index index = ^3; // 表示倒数第三个索引
Console.WriteLine(array[index]); // 输出 3

范围

范围特性用于表示一个从起始索引到结束索引的范围,并常用于切片操作。在示例中,我们创建了一个范围对象表示从索引 1 到索引 4(不包括),然后使用它来获取原数组的子数组,并遍历输出其中的元素。

// 范围
int[] array = { 1, 2, 3, 4, 5 };
Range range = 1..4; // 开始于索引 1,结束于索引 4(不包括)
int[] subArray = array[range]; // 获取指定范围的子数组
foreach (var number in subArray)
{Console.WriteLine(number);
}

处理类型和属性

C#中的反射是指在运行时动态地调查、获取和操作程序集、类型和成员信息的能力。使用反射,你可以在程序运行时获取程序集的元数据,并且可以使用得到的信息来创建对象、调用方法、访问属性等。

1.特性

在C#中,特性(Attribute)是用于为程序实体(如类型、方法、属性等)添加元数据的一种机制。特性允许你声明和使用附加到代码元素上的元数据,以提供关于它们的额外信息。
特性通常以方括号 [] 表示,并可附加到以下内容中:程序集、模块、类、枚举、结构、方法、参数、属性、事件。

2.创建自定义特性

自定义特性是通过创建一个类并继承自 System.Attribute 基类来实现的。在自定义特性类中,你可以定义构造函数和属性来存储特性的元数据信息。通过为自定义特性类添加特定的应用目标(AttributeTargets)和其他约束,可以控制特性可应用的位置和次数。

在使用自定义特性时,你可以在适当的程序实体(如方法、类或者属性)上使用方括号语法将特性应用到它们上面。这样就可以为这些程序实体添加额外的元数据信息,以便在运行时进行检索和使用。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class CustomAttribute : Attribute
{private string description;public CustomAttribute(string description){this.description = description;}public string Description{get { return description; }}
}
public class MyClass
{[Custom("This is a custom attribute")]public void MyMethod(){// 方法内容}
}

3.反射

C#中的反射是一种机制,允许程序在运行时动态地检查类型信息、调用方法和访问属性。通过反射,你可以在程序执行期间获取类型的成员(如字段、方法、属性等)和构造函数的信息,然后基于这些信息来创建对象、调用方法或者修改属性值。

使用 System.Reflection 命名空间中的类,C#提供了丰富的API来支持反射。例如,可以使用 Type 类来获取类型信息,MethodInfo 类来表示方法信息,PropertyInfo 类来表示属性信息等。

反射常用于以下情况:

  • 动态加载程序集:允许在运行时从外部文件或网络载入程序集。
  • 获取类型信息:可以获取类型的字段、属性、方法等信息。
  • 动态创建对象:根据类型来实例化对象。
  • 调用方法和属性:可以使用 MethodInfo 和 PropertyInfo 等来动态调用方法和访问属性。

当你使用反射时,可以做到以下几点:

获取类型信息:

Type type = typeof(MyClass);

创建对象实例:

object instance = Activator.CreateInstance(type);

调用方法:

MethodInfo methodInfo = type.GetMethod("MethodName");
methodInfo.Invoke(instance, null);

访问属性:

PropertyInfo propertyInfo = type.GetProperty("PropertyName");
object propertyValue = propertyInfo.GetValue(instance);

总之,C#中的集合和Span、索引、范围以及反射等功能为开发者提供了丰富的工具和技术,帮助他们更高效地处理数据和操作类型信息。通过灵活运用这些功能,开发者可以编写出更加动态和强大的程序。在实际开发中,根据具体的需求和场景,选择合适的集合类型、内存操作方式以及反射机制来实现所需的功能和性能优化是非常重要的。希望本文对你有所帮助,祝愿你在C#编程的道路上越走越远!

相关文章:

C#常见的.Net类型(二)

目录 一、在集合中存储多个对象理解集合的选择1.列表2.字典3.堆栈4.队列5.集 二、使用Span、索引和范围Span索引范围 处理类型和属性1.特性2.创建自定义特性3.反射 一、在集合中存储多个对象 处理集合的常见类型 类型描述List动态大小的数组&#xff0c;可以按索引访问Dictio…...

oracle临时表空间不释放

项目报错 nested exception is java.sql.SQLException: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP 原因是临时表空间满了&#xff0c;临时表空间一直增长&#xff0c;未释放导致临时表空间使用率100%。 查询临时表空间使用率 --临时表空间利用率…...

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem 从这一章开始讲负反馈Control系统和小信号建模. 13.2 The Feedback Theorem 首先介绍 Middlebrook’s Feedback Theorem 考虑下面负反馈系统 传输函数 Guo/ui G ( s ) u o u i G ∞ T 1 T G…...

科研学习|论文解读——美国政治经济中的权力:网络分析(JASIST, 2019)

论文原题目 Power in the U.S. political economy: A network analysis 摘要 美国政治经济的许多特征产生于大型政治和经济机构之间的互动&#xff0c;然而我们对它们的互动性质和这些机构之间的权力分配知之甚少。在本文中&#xff0c;对总部设在美国的组织的网络进行了详细的…...

常用的git命令

一、常用的git命令 1. 配置 git config --local user.name "xxx" ---仅对当前Git仓库有效。配置信息将保存在当前Git仓库的 .git/config 文件中 local优先级最高&#xff0c;会覆盖其他范围的相同配置 git config --global user.email "xxx" ---全局…...

【AI】用iOS的ML(机器学习)创建自己的AI App

用iOS的ML(机器学习)创建自己的AI App 目录 用iOS的ML(机器学习)创建自己的AI App机器学习如同迭代过程CoreML 的使用方法?软件要求硬件开始吧!!构建管道:设计和训练网络Keras 转 CoreML将模型集成到 Xcode 中结论推荐超级课程: Docker快速入门到精通Kubernetes入门到…...

远程调用初体验笔记

远程调用初体验笔记 微服务架构通常将系统拆分成多个独立的服务单元&#xff0c;每个服务单元都专注于实现特定的业务功能。当一个服务需要使用另一个服务提供的功能时&#xff0c;就可以通过远程调用来实现。 使用步骤 1.步骤 Spring给我们提供了一个RestTemplate工具&#…...

反无人机电子护栏:原理、算法及简单实现

随着无人机技术的快速发展&#xff0c;其在航拍、农业、物流等领域的应用日益广泛。然而&#xff0c;无人机的不规范使用也带来了安全隐患&#xff0c;如侵犯隐私、干扰航空秩序等。为了有效管理无人机&#xff0c;反无人机电子护栏技术应运而生。 目录 一、反无人机电子护栏…...

Java项目利用Redisson实现真正生产可用高并发秒杀功能 支持分布式高并发秒杀

Java中的高并发秒杀场景下我们可以使用redisson来实现高并发秒杀功能, 以下就是一个可用于生产环境的高并发秒杀示例代码: pom依赖 <!-- https://mavenlibs.com/maven/dependency/org.redisson/redisson --><dependency><groupId>org.redisson</groupId&…...

0104行列式的性质-行列式-线性代数

记 D ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ D\begin{vmatrix}a_{11}&a_{12}&\cdots &a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots&&\cdots\\a_{n1}&a_{n2}&\cdots&a_{nn}\en…...

k8s HPA 自动伸缩机制 (配置,资源限制,)

目录 一、概念 核心概念 工作原理 HPA 的配置关键参数 关键组件 使用场景 注意事项 如何确保程序稳定和服务连续 二、metrics-server 部署 metrics-server 准备 metrics-server 镜像: 使用 Helm 安装 metrics-server: 配置 metrics-server: 安装 metrics-server: …...

vulhub中GIT-SHELL 沙盒绕过漏洞复现(CVE-2017-8386)

GIT-SHELL 沙盒绕过&#xff08;CVE-2017-8386&#xff09;导致任意文件读取、可能的任意命令执行漏洞。 测试环境 为了不和docker母机的ssh端口冲突&#xff0c;将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa&#xff0c;这是ssh的私钥&#xff0c;连接的时候请指…...

SpringBoot+vue3打造企业级一体化SaaS系统

SpringBootvue3打造企业级一体化SaaS系统 简介&#xff1a;    全面提升前后端技术水平&#xff0c;独立完成全栈项目开发能力&#xff0c;快速进击全栈工程师&#xff0c;最终在面试中脱颖而出。整合后端主流技术&#xff08;Spring Boot、物理数据库隔离、加载动态权限、多…...

探讨TCP的可靠性以及三次握手的奥秘

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 1. TCP的可靠性机制1.2可靠性的基础上,尽可能得提高效率 2. TCP三次握手过程3. 为何不是四次握手&#xff1f; 在互联网的复杂世界中&#xff0c;TCP&am…...

openai常见的两个错误:BadRequestError和OpenAIError

错误1:openai.OpenAIError: The api_key client option must be set either by passing api_key..... 在通过openai创建客户端必须要设置api key&#xff0c;如果你事先已经在本机的环境中设置未起效可以手动设置&#xff0c;注意手动设置时不要用下面的形式 import openai f…...

2核4g服务器够用吗?

2核4G服务器够用吗&#xff1f;够用。阿腾云以2核4G5M服务器搭建网站为例&#xff0c;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&am…...

数据仓库数据分层详解

数据仓库中的数据分层是一种重要的数据组织方式&#xff0c;其目的是为了在管理数据时能够对数据有一个更加清晰的掌控。以下是数据仓库中的数据分层详解&#xff1a; 原始数据层&#xff08;Raw Data Layer&#xff09;&#xff1a;这是数仓中最底层的层级&#xff0c;用于存…...

unity内存优化之AB包篇(微信小游戏)

1.搭建资源服务器使用(HFS软件(https://www.pianshen.com/article/54621708008/)) using System.Collections; using System.Collections.Generic; using UnityEngine;using System;public class Singleton<T> where T : class, new() {private static readonly Lazy<…...

白话模电:3.三极管(考研面试与笔试常考问题)

一、三极管的简单判断 1.判断三极 1)给了图 左边是b,有箭头是e,剩下是c 2)给了电位 b:中间值&#xff0c;e:较近值(离中间值)&#xff0c;c:较远值(离中间值) 2.判断流向 bc同向(共同流向“|”或共同流离“|”)&#xff0c;e与bc反向 3.判断材料 4.判断类型 5.判断能否构…...

LeetCode 395. 至少有K个重复字符的最长子串

解题思路 一道滑动窗口题型&#xff0c;不过滑动窗口的长度是不同种类元素的个数。 这里需要定义两个变量 cnt,overk。overk表示的是满足大于k的字符数, cnt表示的是该窗口中不同元素的个数且cnt>1&&cnt<26。 相关代码 class Solution {public int longestSub…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...