c#关键字 ArgumentOutOfRangeException .? IEnumerable string.Join

在这里插入图片描述

c# ArgumentOutOfRangeException

ArgumentOutOfRangeException 是 C# 中表示某个参数值超出了方法或属性定义的有效范围时引发的一个异常。这个异常通常在尝试访问数组、集合、字符串等的无效索引,或者当传递给方法或属性的参数不在其有效范围内时发生。

例如,如果你有一个方法,它接受一个整数参数 index,并且这个参数应该在一个特定的范围内(比如 0 到数组的长度减一),但是调用者传递了一个超出这个范围的 index 值,那么这个方法就应该抛出一个 ArgumentOutOfRangeException。

下面是一个简单的例子,演示了如何引发 ArgumentOutOfRangeException:

csharp
public class ExampleClass
{
private int[] array = new int[5]; // 假设数组长度为5

public void SetValue(int index, int value)  
{  
    if (index < 0 || index >= array.Length)  
    {  
        throw new ArgumentOutOfRangeException(nameof(index), "Index must be within the bounds of the array.");  
    }  

    array[index] = value;  
}  

}

// 使用示例
class Program
{
static void Main()
{
ExampleClass example = new ExampleClass();

    try  
    {  
        example.SetValue(6, 42); // 引发 ArgumentOutOfRangeException,因为索引 6 超出了数组的范围  
    }  
    catch (ArgumentOutOfRangeException ex)  
    {  
        Console.WriteLine(ex.Message); // 输出异常信息  
    }  
}  

}
在这个例子中,SetValue 方法检查传入的 index 是否在数组的有效范围内。如果不在,就抛出一个 ArgumentOutOfRangeException,并指定哪个参数(nameof(index))以及一个描述性的错误消息。在 Main 方法中,我们尝试使用超出范围的索引来调用 SetValue 方法,并使用 try-catch 块来捕获并处理这个异常。

c# .?

在C#中,?. 是一个称为“null 条件运算符”(Null-conditional Operator)或“Elvis Operator”的运算符。这个运算符提供了一种简洁的方式来检查对象是否为null,并在不为null的情况下调用其成员。如果左侧的操作数为null,则整个表达式的结果为null,而不会引发NullReferenceException。

这里有一些使用?.运算符的示例:

csharp
// 假设我们有一个可能为null的对象customer
Customer customer = GetCustomer();

// 使用null条件运算符来安全地访问Name属性
string name = customer?.Name; // 如果customer为null,则name为null,否则为customer.Name的值

// 嵌套使用null条件运算符
string address = customer?.Address?.Street; // 如果customer或Address为null,则address为null

// 与null合并运算符(??)结合使用,以提供默认值
string displayName = customer?.Name ?? “Unknown Customer”; // 如果customer为null或Name为null,则displayName为"Unknown Customer"

// 调用方法(如果对象不为null)
int? result = customer?.CalculateSomething(); // 如果customer为null,则result为null,否则为CalculateSomething的返回值

// 访问索引器(如果对象不为null)
int? firstChar = customer?.Name?[0]; // 如果customer或Name为null,或Name没有第一个字符,则firstChar为null

// 分配值(如果对象不为null)
customer?.SomeProperty = newValue; // 如果customer不为null,则设置SomeProperty的值为newValue
请注意,?.运算符不会执行短路评估(short-circuiting)来避免后续操作中的null引用,它仅检查左侧操作数是否为null。如果你需要基于多个条件来避免null引用,你可能需要链式地使用多个?.运算符或使用其他逻辑来控制流程。

此外,?.运算符不会改变左侧操作数的值或状态,它只是提供了一个安全的方式来访问成员或调用方法,而不会导致NullReferenceException。

c# CancellationToken

在C#中,CancellationToken是一个非常重要的类,主要用于表示操作的取消请求。它通常与异步编程和长时间运行的操作一起使用,以提供一种优雅的方式来取消这些操作。

以下是关于CancellationToken的一些关键点和用法:

来源:
CancellationToken通常通过CancellationTokenSource创建。CancellationTokenSource允许你发出取消信号。
你也可以在需要取消操作时传递预定义的取消令牌,如CancellationToken.None(表示没有取消请求)或来自其他源的令牌。
使用:
在执行异步操作(如使用Task或Task)时,你可以接受一个CancellationToken参数。
当调用者决定取消操作时,它会调用CancellationTokenSource.Cancel方法,这会设置CancellationToken的IsCancellationRequested属性为true。
执行操作的方法应该定期检查CancellationToken.IsCancellationRequested属性,并在收到取消请求时适当地响应。
响应取消:
当操作检测到取消请求时,它应该停止正在执行的工作,并(尽可能)清理其资源。
通常,可以通过抛出一个OperationCanceledException来响应取消请求,但这不是强制的。重要的是要优雅地停止操作并释放资源。
传播取消:
如果一个操作创建了其他操作或任务,并且这些操作或任务也应该在原始操作被取消时取消,那么原始操作的取消令牌应该传递给这些子操作或任务。
超时:
CancellationToken经常与超时一起使用。你可以使用CancellationTokenSource.CancelAfter方法来指定一个超时时间。
监听取消:
你可以使用CancellationToken.Register方法来注册一个回调,当取消令牌被取消时,该回调会被调用。
注意事项:
不要在取消令牌被取消后继续使用它。一旦令牌被取消,它就不能再被重置或再次使用。
确保在操作被取消时正确释放所有资源。
以下是一个简单的示例,演示了如何使用CancellationToken和CancellationTokenSource:

csharp
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
var cts = new CancellationTokenSource();

    // 模拟一个长时间运行的操作  
    var task = Task.Run(() => LongRunningOperation(cts.Token), cts.Token);  

    // 等待一段时间,然后取消操作  
    await Task.Delay(2000); // 等待2秒  
    cts.Cancel();  

    try  
    {  
        await task; // 等待操作完成(或抛出异常)  
    }  
    catch (OperationCanceledException)  
    {  
        Console.WriteLine("Operation was canceled.");  
    }  
}  

static void LongRunningOperation(CancellationToken token)  
{  
    for (int i = 0; i < 10; i++)  
    {  
        if (token.IsCancellationRequested)  
        {  
            Console.WriteLine("Cancellation requested.");  
            // 清理资源(如果有的话)并退出方法  
            return;  
        }  

        Thread.Sleep(500); // 模拟工作  
        Console.WriteLine("Working...");  
    }  
}  

}

c# IEnumerable

在C#中,IEnumerable 是一个特定的泛型接口,它继承自非泛型的 IEnumerable 接口,并专门用于表示可以枚举的整数集合。这个接口定义了一个 GetEnumerator() 方法,该方法返回一个 IEnumerator 类型的对象,该对象用于遍历集合中的整数。

IEnumerable 接口通常在处理整数集合的场景中使用,比如当你需要遍历一个整数数组、列表(List)或者其他实现了 IEnumerable 接口的自定义集合时。

下面是一个简单的示例,展示了如何使用 IEnumerable:

csharp
using System;
using System.Collections.Generic;

class Program
{
static void Main()
{
// 创建一个整数列表
List numbers = new List { 1, 2, 3, 4, 5 };

    // 因为List<int>实现了IEnumerable<int>接口,所以可以直接遍历  
    foreach (int number in numbers)  
    {  
        Console.WriteLine(number);  
    }  

    // 创建一个返回IEnumerable<int>的方法  
    IEnumerable<int> evenNumbers = GetEvenNumbers(10);  

    // 遍历返回的IEnumerable<int>  
    foreach (int evenNumber in evenNumbers)  
    {  
        Console.WriteLine(evenNumber);  
    }  
}  

// 一个返回IEnumerable<int>的方法  
static IEnumerable<int> GetEvenNumbers(int count)  
{  
    for (int i = 0; i < count; i += 2)  
    {  
        yield return i; // 使用迭代器块(yield return)来返回一系列整数  
    }  
}  

}
在上面的示例中,我们首先创建了一个 List 对象,并填充了一些整数。由于 List 实现了 IEnumerable 接口,我们可以直接使用 foreach 循环来遍历它。

然后,我们定义了一个名为 GetEvenNumbers 的方法,它返回一个 IEnumerable。这个方法使用迭代器块(yield return)来生成一个包含偶数的序列。在 Main 方法中,我们调用 GetEvenNumbers 方法,并使用 foreach 循环来遍历返回的偶数序列。

通过使用 IEnumerable,我们可以很容易地创建和遍历整数集合,而不必关心这些集合的具体实现细节。这使得代码更加灵活和可重用。

string.Join

string.Join 是C#中 System.String 类的一个静态方法,用于将多个字符串按照指定的分隔符连接成一个新的字符串。这个方法接受两个参数(或更多,取决于重载版本):

分隔符(separator):用于连接各个元素的字符串。
字符串数组或可迭代集合(values):要连接的字符串的集合。
以下是 string.Join 方法的基本用法示例:

csharp
using System;

class Program
{
static void Main()
{
string[] words = { “Hello”, “World”, “!” };
string sentence = string.Join(" ", words); // 使用空格作为分隔符
Console.WriteLine(sentence); // 输出: Hello World !

    string commaSeparated = string.Join(",", words); // 使用逗号作为分隔符  
    Console.WriteLine(commaSeparated); // 输出: Hello,World,!  

    // 也可以使用其他类型的可迭代集合,如List<string>  
    List<string> listWords = new List<string> { "Hello", "World", "!" };  
    string listSentence = string.Join(" ", listWords);  
    Console.WriteLine(listSentence); // 输出: Hello World !  
}  

}
除了接受字符串数组或 IEnumerable 作为参数之外,string.Join 方法还有其他重载版本,可以接受其他类型的集合,只要这些集合的元素可以隐式转换为字符串。

注意:当使用 string.Join 连接字符串时,如果源集合(如数组或列表)是 null,string.Join 方法将返回一个空字符串,而不是抛出异常。但是,如果源集合中的某个元素是 null,那么 null 将被视为空字符串进行连接。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅学JVM

一、基本概念 目录 一、基本概念 二、JVM 运行时内存 1、新生代 1.1 Eden 区 1.2. ServivorFrom 1.3. ServivorTo 1.4 MinorGC 的过程 &#xff08;复制- >清空- >互换&#xff09; 1.4.1&#xff1a;eden 、servicorFrom 复制到ServicorTo&#xff0c;年龄1 …

K8S集群进行分布式负载测试

使用K8S集群执行分布式负载测试 本教程介绍如何使用Kubernetes部署分布式负载测试框架&#xff0c;该框架使用分布式部署的locust 产生压测流量&#xff0c;对一个部署到 K8S集群的 Web 应用执行负载测试&#xff0c;该 Web 应用公开了 REST 格式的端点&#xff0c;以响应传入…

C++用Crow实现一个简单的Web程序,实现动态页面,向页面中输入数据并展示

Crow是一个轻量级、快速的C微框架&#xff0c;用于构建Web应用程序和RESTful API。 将处理前端页面的POST请求以添加数据的逻辑添加到 /submit 路由中&#xff0c;并添加了一个新的路由 / 用于返回包含输入框、按钮和表格的完整页面。当用户向表格添加数据时&#xff0c;JavaS…

创新与责任并重!中国星坤连接器的可持续发展战略!

在当今全球化的商业环境中&#xff0c;企业的社会责任、技术创新和产品质量是企业可持续发展的三大支柱。中国星坤正是这样一家企业&#xff0c;它在电子连接技术领域以其卓越的技术创新、坚定的环保责任和严格的生产品控而著称。本文将深入探讨星坤科技如何通过其FAE技术团队的…

浏览器扩展V3开发系列之 chrome.contextMenus 右键菜单的用法和案例

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.contextMenus 允许开发者向浏览器的右键菜单添加自定义项。 在使用 chrome.contextMenus 之前…

CMN-700(1)CMN-700概述

本章介绍CMN-700&#xff0c;这是用于AMBA5 CHI互连&#xff0c;且可根据需要定制的网格拓扑结构。 1. 关于CMN‐700 CMN‐700是一种可配置扩展的一致性互连网络&#xff0c;旨在满足高端网络和企业计算应用中使用的一致性网络系统的功率、性能和面积(PPA)要求。支持1-256个处…

ES6深潜指南:解锁JavaScript类与继承的高级技巧,让您的代码更加优雅

前言 随着前端技术的迅猛发展&#xff0c;JavaScript已经成为构建现代Web应用不可或缺的编程语言。ES6&#xff08;ECMAScript 2015&#xff09;引入了许多期待已久的特性&#xff0c;其中类&#xff08;Classes&#xff09;和继承机制的引入&#xff0c;极大地增强了JavaScrip…

gc.log中 CMS-concurrent-abortable-preclean

问题 在gc日志中看到 2024-06-26T16:16:07.5040800: 64690272.666: [CMS-concurrent-abortable-preclean-start]CMS: abort preclean due to time 2024-06-26T16:16:12.5530800: 64690277.716: [CMS-concurrent-abortable-preclean: 1.052/5.049 secs] [Times: user1.33 sys0…

Gradle学习-3 Gradle构建的生命周期

Gradle常用文件目录 Gradle 构建的生命周期&#xff0c;有3个阶段: 初始化阶段配置阶段执行阶段 1、初始化阶段 Gradle 支持构建单个工程个多个子工程&#xff0c;初始化阶段主要负责收集所有参与本次构建的子工程&#xff0c;创建一个项目的层次结构&#xff0c;并未每个…

喜报!极限科技新获得一项国家发明专利授权:“搜索数据库的正排索引处理方法、装置、介质和设备”

近日&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司&#xff08;简称&#xff1a;极限科技&#xff09;新获得一项国家发明专利授权&#xff0c;专利名为 “搜索数据库的正排索引处理方法、装置、介质和设备”&#xff0c;专利号&#xff1a;ZL 2024 1 0479400…

实用软件下载:BetterZip 5最新安装包及详细安装教程

​我们都知道BetterZip是Mac平台上非常受欢迎的文件“解/压缩”工具之一&#xff0c;并且能够生成被Win支持的压缩包。不同领域的应用证明了这是一款功能强大的 Mac 解压缩软件支持 RAR、ZIP等30 种档案格式&#xff0c;可创建小型应用软件。值得一提的是而且能够在不必解压的情…

【教学类-64-05】20240625彩棒鱼骨图(二)AB排列 6.5*1CM 6选2根 30种

背景需求&#xff1a; 【教学类-64-04】20240619彩棒鱼骨图&#xff08;一&#xff09;6.5*1CM 6根棒子720种-CSDN博客文章浏览阅读897次&#xff0c;点赞23次&#xff0c;收藏13次。【教学类-64-04】20240619彩棒鱼骨图&#xff08;一&#xff09;6.5*1CM 6根棒子720种https:…

WordPress强大多功能主题模板The7 v9.16.0

模板介绍 The7可以与WPBakery Page Builder&#xff08;原Visual Composer&#xff09;和Ultimate Addons的完全无缝集成。它也与大多数流行的插件完全兼容&#xff0c;例如WooCommerce&#xff0c;WPML&#xff0c;Yoast SEO&#xff0c;All in One WP Migration&#xff0c;…

视觉分割的定义与性能度量

文章目录 视觉分割的定义语义分割(Semantic Segmentation)实例分割(instance Segmentation)全景分割(Panoptic Segmentation)视频语义分割(Video Semantic Segmentation)视频实例分割(Video instance Segmentation)视频全景分割(Video Panoptic Segmentation)各任务对比 视觉分…

classnames.js 优化类名的工具库

classnames.js 是什么? classnames.js 是一个简单的类名控制工具库,可以方便的通过条件动态控制class类名的显示。 官方代码及示例文档参见:GitHub - JedWatson/classnames: A simple javascript utility for conditionally joining classNames together 为什么要使用 clas…

Linux扩展lvm分区实践 -- 使用其他磁盘的空间

如图&#xff0c;根分区900G&#xff0c;计划将另一块磁盘sdb分出1T来给根分区 步骤 1&#xff1a;创建新的分区 sudo fdisk /dev/sdb输入 n 创建一个新分区 然后选择分区类型&#xff0c;输入p 设置起始扇区&#xff08;默认&#xff09;&#xff0c;然后设置分区大小&…

服务器部署与DDOS攻防

知识点&#xff1a;DHPC与Web服务部署&#xff0c;DHCPig攻防&#xff0c;SYN Flooding测试 DHCP&#xff1a; 能够自动为客户机获取IP等参数 DHCP是动态主机配置协议&#xff08;Dynamic Host Configuration Protocol&#xff09;的缩写&#xff0c;它是一种网络管理协议&am…

633. 平方数之和(中等)

633. 平方数之和 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java内存溢出溢出代码正确代码与截图 1. 题目描述 题目中转&#xff1a;633. 平方数之和 2.详细题解 本题是167. 两数之和 II - 输入有序数组&#xff08;中等&#xff09;题目的变型&#xff0c;由两数之和变…

PS系统教程30

图层蒙版组合使用 案例介绍 全选背景图-复制背景图粘贴背景图CtrlI反选背景色填充黑色快速选区工具框柱需要素材画笔涂抹白色 步骤截图 1-3 4-5 图层蒙版与渐变工具结合使用 案例2 注意 使用PS的渐变工具覆盖全部的原因可能包括操作不当或设置错误。 操作不当&#xff1…

docker入门配置

1、创建配置镜像 由于国内docker连接外网速度慢&#xff0c;采用代理 vi /etc/docker/daemon.json添加以下内容 {"registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com","https://dockerproxy.com","https://hub-mirror.c.163.co…