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,一经查实,立即删除!

相关文章

Linux 经典面试八股文

快速鉴别十个题 1&#xff0c;你如何描述Linux文件系统的结构&#xff1f; 答案应包括对/, /etc, /var, /home, /bin, /lib, /usr, 和 /tmp等常见目录的功能和用途的描述。 2&#xff0c;在Linux中如何查看和终止正在运行的进程&#xff1f; 期望的答案应涵盖ps, top, htop, …

香港服务器网络延迟的测量指标包括哪些?

网络延迟是影响香港服务器性能和用户体验的关键因素。网络延迟是指数据包从源头传输到目的地所需的时间。延迟的产生可能受到多种因素的影响&#xff0c;包括网络拥塞、传输媒介、路由器处理时间等。理解延迟的不同测量指标是评估和优化网络性能的重要基础。 主要测量指标&…

各种网络设备的工作原理

网络设备的工作原理涉及多种设备&#xff0c;包括路由器、交换机、防火墙等&#xff0c;它们各自承担着不同的功能。以下是对这些设备工作原理的详细解释&#xff1a; 一、路由器路由器是互联网通信中的关键设备&#xff0c;它负责在不同网络之间传输数据包。功能&#xff1a;路…

GEE 使用 JavaScript 中的 API 自动删除文件夹内的所有资产

目录 简介 函数 ee.data.listAssets(parent, params, callback) Arguments: Returns: api.ListAssetsResponse ee.data.deleteAsset(assetId, callback) Arguments: forEach(outputNames) Arguments: Returns: Reducer 代码 简介 使用 JavaScript 中的 API 自动删除…

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;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

【ChatGPT】让ChatGPT在回答中附带参考文献与来源

让ChatGPT在回答中附带参考文献与来源 在撰写内容时&#xff0c;引用参考文献和来源可以增强信息的可信度和权威性。通过引导ChatGPT生成带有参考文献的回答&#xff0c;用户能够获取更可靠的信息和背景资料。本文将探讨如何有效地引导ChatGPT在回答中附带参考文献与来源。 一…

Flutter鸿蒙next 中的 Expanded 和 Flexible 使用技巧详解

在 Flutter 开发中&#xff0c;Expanded 和 Flexible 是两个非常常用的布局控件&#xff0c;它们可以帮助开发者更加灵活地管理 UI 布局的空间分配。虽然它们看起来非常相似&#xff0c;但它们的功能和使用场景有所不同。理解这两者的区别&#xff0c;能帮助你在构建复杂 UI 布…

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

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

项目开发流程规范文档

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

springcloud各组件说明

Spring Cloud 是一个构建分布式微服务架构的开源框架&#xff0c;提供了一系列的组件和工具&#xff0c;用于实现服务治理、负载均衡、服务调用、断路器、API网关、配置中心、链路追踪等功能。 1. Eureka - 服务注册与发现 原理 Eureka 是 Netflix 开源的一个服务发现组件&am…

【入门篇】2.10 串口打印Helloworld

目录 一,printf函数 二,printf函数示例 三,fputc函数 四,重定义fputc函数 一,printf函数 如果我们要通过串口输出“Helloworld”,就需要printf函数。那么如何满足在串口输出“Helloworld”呢? printf是 C 语言中的一个标准库函数,主要用于向标准输出设备输出格式…

在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…

ChatGPT o1与GPT-4o、Claude 3.5 Sonnet和Gemini 1.5 Pro的比较

全新的ChatGPT o1模型&#xff08;代号“Strawberry”&#xff09;是OpenAI的最新进展&#xff0c;专注于以前的AI模型难以应对的领域&#xff1a;高层次推理、数学和复杂编程。OpenAI设计o1模型以花费更多时间思考问题&#xff0c;使其在需要逐层推理的任务中提高准确性。本文…

【极限编程(XP)】

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