windows C#-析构元组和其他类型(下)

用户定义类型的扩展方法

如果没有创建类、结构或接口,仍可通过实现一个或多个 Deconstruct 扩展方法来析构该类型的对象,以返回所需值。

以下示例为 System.Reflection.PropertyInfo 类定义了两个 Deconstruct 扩展方法。 第一个方法返回一组值,指示属性的特征,包括其类型、是静态还是实例、是否为只读,以及是否已编制索引。 第二个方法指示属性的可访问性。 因为 get 和 set 访问器的可访问性可能不同,所以布尔值指示属性是否具有单独的 get 和 set 访问器,如果是,则指示它们是否具有相同的可访问性。 如果只有一个访问器,或者 get 和 set 访问器具有相同的可访问性,则 access 变量指示整个属性的可访问性。 否则,get 和 set 访问器的可访问性由 getAccess 和 setAccess 变量指示。

using System;
using System.Collections.Generic;
using System.Reflection;public static class ReflectionExtensions
{public static void Deconstruct(this PropertyInfo p, out bool isStatic,out bool isReadOnly, out bool isIndexed,out Type propertyType){var getter = p.GetMethod;// Is the property read-only?isReadOnly = ! p.CanWrite;// Is the property instance or static?isStatic = getter.IsStatic;// Is the property indexed?isIndexed = p.GetIndexParameters().Length > 0;// Get the property type.propertyType = p.PropertyType;}public static void Deconstruct(this PropertyInfo p, out bool hasGetAndSet,out bool sameAccess, out string access,out string getAccess, out string setAccess){hasGetAndSet = sameAccess = false;string getAccessTemp = null;string setAccessTemp = null;MethodInfo getter = null;if (p.CanRead)getter = p.GetMethod;MethodInfo setter = null;if (p.CanWrite)setter = p.SetMethod;if (setter != null && getter != null)hasGetAndSet = true;if (getter != null){if (getter.IsPublic)getAccessTemp = "public";else if (getter.IsPrivate)getAccessTemp = "private";else if (getter.IsAssembly)getAccessTemp = "internal";else if (getter.IsFamily)getAccessTemp = "protected";else if (getter.IsFamilyOrAssembly)getAccessTemp = "protected internal";}if (setter != null){if (setter.IsPublic)setAccessTemp = "public";else if (setter.IsPrivate)setAccessTemp = "private";else if (setter.IsAssembly)setAccessTemp = "internal";else if (setter.IsFamily)setAccessTemp = "protected";else if (setter.IsFamilyOrAssembly)setAccessTemp = "protected internal";}// Are the accessibility of the getter and setter the same?if (setAccessTemp == getAccessTemp){sameAccess = true;access = getAccessTemp;getAccess = setAccess = String.Empty;}else{access = null;getAccess = getAccessTemp;setAccess = setAccessTemp;}}
}public class ExampleExtension
{public static void Main(){Type dateType = typeof(DateTime);PropertyInfo prop = dateType.GetProperty("Now");var (isStatic, isRO, isIndexed, propType) = prop;Console.WriteLine($"\nThe {dateType.FullName}.{prop.Name} property:");Console.WriteLine($"   PropertyType: {propType.Name}");Console.WriteLine($"   Static:       {isStatic}");Console.WriteLine($"   Read-only:    {isRO}");Console.WriteLine($"   Indexed:      {isIndexed}");Type listType = typeof(List<>);prop = listType.GetProperty("Item",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);var (hasGetAndSet, sameAccess, accessibility, getAccessibility, setAccessibility) = prop;Console.Write($"\nAccessibility of the {listType.FullName}.{prop.Name} property: ");if (!hasGetAndSet | sameAccess){Console.WriteLine(accessibility);}else{Console.WriteLine($"\n   The get accessor: {getAccessibility}");Console.WriteLine($"   The set accessor: {setAccessibility}");}}
}
// The example displays the following output:
//       The System.DateTime.Now property:
//          PropertyType: DateTime
//          Static:       True
//          Read-only:    True
//          Indexed:      False
//
//       Accessibility of the System.Collections.Generic.List`1.Item property: public
系统类型的扩展方法

为了方便起见,某些系统类型提供 Deconstruct 方法。 例如,System.Collections.Generic.KeyValuePair<TKey,TValue> 类型提供此功能。 循环访问 System.Collections.Generic.Dictionary<TKey,TValue> 时,每个元素都是 KeyValuePair<TKey, TValue>,并且可以析构。 请考虑以下示例:

Dictionary<string, int> snapshotCommitMap = new(StringComparer.OrdinalIgnoreCase)
{["https://github.com/dotnet/docs"] = 16_465,["https://github.com/dotnet/runtime"] = 114_223,["https://github.com/dotnet/installer"] = 22_436,["https://github.com/dotnet/roslyn"] = 79_484,["https://github.com/dotnet/aspnetcore"] = 48_386
};foreach (var (repo, commitCount) in snapshotCommitMap)
{Console.WriteLine($"The {repo} repository had {commitCount:N0} commits as of November 10th, 2021.");
}

向要没有 Deconstruct 方法的系统类型添加此方法。 请考虑以下扩展方法:

public static class NullableExtensions
{public static void Deconstruct<T>(this T? nullable,out bool hasValue,out T value) where T : struct{hasValue = nullable.HasValue;value = nullable.GetValueOrDefault();}
}

通过此扩展方法,可将所有 Nullable<T> 类型析构为 (bool hasValue, T value) 的元组。 下面的示例演示了使用此扩展方法的代码:

DateTime? questionableDateTime = default;
var (hasValue, value) = questionableDateTime;
Console.WriteLine($"{{ HasValue = {hasValue}, Value = {value} }}");questionableDateTime = DateTime.Now;
(hasValue, value) = questionableDateTime;
Console.WriteLine($"{{ HasValue = {hasValue}, Value = {value} }}");// Example outputs:
// { HasValue = False, Value = 1/1/0001 12:00:00 AM }
// { HasValue = True, Value = 11/10/2021 6:11:45 PM }
record 类型

使用两个或多个位置参数声明记录类型时,编译器将为 record 声明中的每个位置参数创建一个带有 out 参数的 Deconstruct 方法。

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

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

相关文章

JVM知识点大全(未完...)

JVM运行时数据区域 堆 堆是Java虚拟机中用于存储对象的主要区域&#xff0c;包括字符串常量池。绝大多数对象都是在堆中创建的&#xff08;少部分对象可能会在栈上分配&#xff09;。为了更好地进行垃圾回收&#xff0c;堆被划分为年轻代和老年代两部分。年轻代又被进一步分为E…

九宫格按键输入

题目描述 九宫格按键输入&#xff0c;有英文和数字两个模式&#xff0c;默认是数字模式&#xff0c;数字模式直接输出数字&#xff0c;英文模式连续按同一个按键会依次出现这个按键上的字母&#xff0c;如果输入""或者其他字符&#xff0c;则循环中断&#xff0c;输…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

ZISUOJ 2024算法基础公选课练习一(1)

前言、 又是一年算法公选课&#xff0c;与去年不同的是今年学了一些纯C&#xff08;而不是带类的C&#xff09; 一、我的C模板 1.1 模板1 #include <bits/stdc.h> using i64 long long;int main() {std::cin.tie(nullptr)->sync_with_stdio(false);return 0; } 1…

基于STM32的八位数码管显示Proteus仿真设计

基于STM32的八位数码管显示Proteus仿真设计 1.主要功能2.仿真设计3. 程序设计4. 设计报告5. 资料清单&下载链接 基于STM32的八位数码管显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;…

【机器学习】Lesson 4 - 朴素贝叶斯(NB)文本分类

目录 背景 一、适用数据集 1. 数据集选择 1.1 适用领域 1.2 数据集维度&#xff08;特征数&#xff09; 1.3 数据行数 2. 本文数据集介绍 2.1 数据集特征 2.2 数据格式 3. 数据集下载 二、算法原理 1. 朴素贝叶斯定理 2. 算法逻辑 3. 运行步骤 4. 更多延申模型 …

软考教材重点内容 信息安全工程师 第1章 网络信息安全概述

第 1 章 网络信息安全概述 1.1.1 网络信息安全相关概念 狭义上的网络信息安全特指网络信息系统的各组成要素符合安全属性的要求&#xff0c;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

使用Vue3和Vue2进行开发的区别

使用Vue3和Vue2进行开发的区别 笔者虽然老早就是用vue3进行开发了&#xff0c;但是上次有人问道使用vue3进行开发跟使用vue2进行开发的区别有哪些这个问题的时候&#xff0c;回答的还是有些琐碎&#xff0c;干脆今天专门整理一下&#xff0c;做个记录。 一、再也不用set了 众所…

项目开发流程规范文档

项目开发流程规范文档 目标: 明确项目组中需求管理人员, 交互设计, 美工以及开发之间的工作输入输出产物. 明确各岗位职责. 以免造成开发, 产品经理以及项目经理之间理解不到位, 沟通成本过高,返工造成资源浪费. 所有环节产生的文档都可以作为项目交付的资源. 而不是事后再补文…

在docker里创建 bridge 网络联通不同容器

1.网络创建&#xff1a; docker network create --subnet192.168.1.0/24 --gateway192.168.1.1 uav_management 2.查看网络&#xff1a; docker network ls 3.给已经创建的容器分配ip: docker network connect --ip 192.168.1.10 uav_management 容器名/容器id 示例&#xf…

【极限编程(XP)】

极限编程&#xff08;XP&#xff09;简介 定义与核心价值观&#xff1a;极限编程&#xff08;Extreme Programming&#xff0c;XP&#xff09;是一种轻量级、敏捷的软件开发方法。它强调团队合作、客户参与、持续测试和快速反馈等价值观&#xff0c;旨在提高软件开发的效率和质…

低代码用户中心:简化开发,提升效率的新时代

随着数字化转型的加速&#xff0c;企业对于快速交付高质量应用的需求日益增长。在这个背景下&#xff0c;低代码开发平台应运而生&#xff0c;成为越来越多企业和开发者的首选工具。今天&#xff0c;我们将聚焦于低代码用户中心&#xff0c;探讨其如何帮助开发者简化流程、提升…

Docker在CentOS上的安装与配置

前言 随着云计算和微服务架构的兴起&#xff0c;Docker作为一种轻量级的容器技术&#xff0c;已经成为现代软件开发和运维中的重要工具。本文旨在为初学者提供一份详尽的指南&#xff0c;帮助他们在CentOS系统上安装和配置Docker及相关组件&#xff0c;如Docker Compose和私有…

Redis 权限控制(ACL)|ACL 命令详解、ACL 持久化

官网文档地址&#xff1a;https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/ 使用版本&#xff1a;Redis7.4.1 什么是 ACL&#xff1f; ACL&#xff08;Access Control List&#xff09;&#xff0c;权限控制列表&#xff0c;是 Redis 提供的一种…

淘宝反爬虫机制的主要手段有哪些?

淘宝的反爬虫机制主要有以下手段&#xff1a; 一、用户身份识别与验证&#xff1a; User-Agent 识别&#xff1a;通过检测 HTTP 请求头中的 User-Agent 字段来判断请求是否来自合法的浏览器。正常用户使用不同浏览器访问时&#xff0c;User-Agent 会有所不同&#xff0c;而爬虫…

2024最新gewe开发微信机器人教程说明

微信时代&#xff0c;越来越多的业务/服务沟通已直接在微信上完成&#xff0c;但在沟通效率及员工管理方面却存在如下问题&#xff1a; 1、现有的微信功能&#xff0c;已无法满足与客户沟通时的高效率要求 2、当员工掌管的微信号若干或更多时&#xff0c;迫切需要有个汇总工具…

Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着科技的飞速发展&#xff0c;人们的…

如何使用Langchain集成Kimi AI(Moonshot AI)

如何使用Langchain集成Kimi&#xff08;Moonshot AI&#xff09; 一、获取API密钥1. 注册账号2. 获取密钥 二、环境配置三、上手四、整合一下五、检验一下成果六、官方网站 一、获取API密钥 1. 注册账号 毕竟只有注册过帐号才能拿到key~ Moonshot 登陆 2. 获取密钥 用户中心…

前端开发模板Pear Admin Layui

目录 基本资料学习笔记04-Pear-Admin-Layui模板运行05-Pear-Admin-Layui-GIT方式代...06-Pear-Admin与Vue对比 & 07-Pear-Admin与Vue对比补充09-Pear-Admin-CRUD练习-数据库表创建12-Pear-Admin-CRUD练习-引入其它依赖 & 13-Pear-Admin-CRUD练习-三层架构以及常见配置 …

新世联科技:NG2-A-7在DAC空气捕集提取CO2的应用

一、DAC空气捕集提取CO2的介绍 直接空气碳捕获&#xff08;Direct Air Capture&#xff0c;简称DAC&#xff09;是一种直接从大气中提取二氧化碳的技术。 二、DAC空气捕集提取CO2的前景 从大气中提取的这种二氧化碳可以作为循环经济的一部分以各种不同方式使用。未来&#xf…