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

news2024/11/20 6:27:52

在这里插入图片描述

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 将被视为空字符串进行连接。

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

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

相关文章

Rill Data:实时数据分析的未来

欢迎来到 Rill Rill是从数据湖到仪表板的最快路径。 rilldata 与大多数 BI 工具不同&#xff0c;Rill 带有自己的嵌入式内存数据库。数据和计算位于同一位置&#xff0c;查询以毫秒为单位返回。 因此&#xff0c;您可以即时透视、切片和深入研究数据。 下载 Rill 开始建模数…

写程序100道41-50

41.定义一个Father和Child类&#xff0c;并进行测试。 要求如下&#xff1a; (1)Father类为外部类&#xff0c;类中定义一个私有的String类型的属性name&#xff0c;name的值为“Join”。 (2)Child类为Father类的内部类&#xff0c;其中定义一个readName()方法&#xff0c;方…

【数据结构初阶】--- 归并排序

归并排序 递归递归的思路归并的步骤&#xff1a;代码示例 非递归快排为什么可以用栈模拟&#xff1a;归并可以用栈模拟吗&#xff1f;非递归的思路初版代码示例问题&#xff1a;越界 时间复杂度针对递归的优化小区间优化 递归 递归的思路 归并的前提是需要两个有序的区间&…

LLM大模型算法学习资源持续整理

文章目录 waytoagiLLM101llm-coursellm-cookbook waytoagi 飞书文档写的AGI知识库。 https://www.waytoagi.com/ LLM101 karpathy更新中的大模型教程&#xff1a; https://github.com/karpathy/LLM101n llm-course Course to get into Large Language Models (LLMs) wi…

【前端】实现时钟网页

【前端】实现时钟网页 文章目录 【前端】实现时钟网页项目介绍代码效果图 项目介绍 时钟显示在网页中央&#xff0c;并且使网页能够切换白天和夜晚两种模式。搭建基本的html结构&#xff0c;动态得到实时的时&#xff0c;分&#xff0c;秒 通过Date()函数获得。将得到的数字根…

单片机学习记录

一&#xff0c;单片机及开发板介绍 1&#xff0c;基本介绍 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(…

SpringBoot整合拦截器和日期转换器

一、SpringBoot整合拦截器 1.添加拦截器 package com.by.interceptor;import com.by.pojo.User; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import java…

程序员如何用ChatGPT解决常见编程问题:实例解析

引言 在现代编程的世界中&#xff0c;技术进步日新月异&#xff0c;程序员们面临着各种各样的挑战和问题。解决这些问题的过程中&#xff0c;找到合适的工具至关重要。ChatGPT作为一种先进的人工智能语言模型&#xff0c;能够帮助程序员迅速、高效地解决常见的编程问题。本文将…

【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx

【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载&#xff1a; https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括…

揭秘循环购模式:消费即投资,边消费边赚钱!

大家好&#xff0c;我是你们的电商顾问吴军。今天&#xff0c;我将带大家走进一个引人瞩目的商业模式——循环购模式。你可能会好奇&#xff0c;为何有商家能如此慷慨&#xff0c;消费1000元就送2000元&#xff1f;每天还有额外的现金收入&#xff1f;这背后究竟隐藏着怎样的秘…

Cadence计算器函数leafValue

与getData结合使用 leafValue( getData(“/output” ?result “dc”) 转自eetop https://bbs.eetop.cn/thread-931912-1-1.html

20240627 每日AI必读资讯

&#x1f50d;挑战英伟达&#xff01;00 后哈佛辍学小哥研发史上最快 AI 芯片 - 3名大学辍学生创立、目前仅35 名员工、刚筹集1.2 亿美元的团队&#xff1a;Etched。 - 史上最快Transformer芯片诞生了&#xff01; - 用Sohu跑Llama 70B&#xff0c;推理性能已超B200十倍&…

让AI保持怪异

让AI保持怪异 Anthropic的创意技术专家和员工设计师凯尔图尔曼(Kyle Turman)分享了一种深深引起共鸣的观点。他说(转述原话):“人工智能实际上真的很奇怪&#xff0c;我认为人们对这一点的认识还不够。”这引发了我向小组提出的问题:我们是否有消毒人工智能固有的陌生感的风险?…

办公软件汇总

1、OCR 1.1 pearOCR pearOCR 是一个免费的免费在线文字提取OCR工具网站。PearOCR界面简洁&#xff0c;所有过程均在网页端完成,无需下载任何软件&#xff0c;点开即用。官方地址&#xff1a;https://pearocr.com/ 参考&#xff1a;9款文字识别&#xff08;OCR&#xff09;工具…

魔众一物一码溯源防伪系统——守护品牌,守护信任!

在这个充满竞争的市场上&#xff0c;如何确保你的产品不被仿冒&#xff0c;如何赢得消费者的信任&#xff1f;魔众一物一码溯源防伪系统&#xff0c;为你提供一站式解决方案&#xff0c;守护你的品牌&#xff0c;守护消费者的信任&#xff01; &#x1f50d;魔众一物一码溯源防…

玩机进阶教程----MTK芯片使用Maui META修复基带 改写参数详细教程步骤解析

目前mtk芯片与高通芯片在主流机型 上使用比较普遍。但有时候版本更新或者误檫除分区等等原因会导致手机基带和串码丢失的故障。mtk芯片区别与高通。在早期mtk芯片中可以使用工具SN_Writer_Tool读写参数。但一些新版本机型兼容性不太好。今天使用另外一款工具来演示mtk芯片改写参…

企业如何通过数据资产入表与融资加速数字化转型

数据作为五大生产要素之一&#xff0c;是数字经济发展的基础。如何对数据资产进行确权、核算和变现&#xff0c;已成为数字经济时代的难点和热点。随着“数据资产入表”的提出与实践&#xff0c;这一领域迎来了新的变化与机遇。 一、什么是数据资产入表 在我国&#xff0c;数据…

【第2章】MyBatis-Plus代码生成器

文章目录 前言一、安装二、生成方式1.DefaultQuery (元数据查询)2.存在问题 三、快速生成1. 生成代码2. 目录结构 四、交互式总结 前言 全新的 MyBatis-Plus 代码生成器&#xff0c;通过 builder 模式可以快速生成你想要的代码&#xff0c;快速且优雅&#xff0c;跟随下面的代…

JetBrains Rider 2024安装教程

一、下载Rider 1、进入官网&#xff0c;点击“下载” 2、下载完毕 二、安装Rider 1、双击下载的exe文件 2、点击“下一步” 3、可以点击“浏览”选择安装路径&#xff0c;之后点击“下一步” 4、选中图中四项&#xff0c;点击“下一步” 5、选中图中四项&#xff0c;点击“下…

mysql自动填写当前时间,添加索引

mysql自动填写当前时间 在navicat操作界面创建表时&#xff0c;如果需要自动填写时间&#xff0c;可以操作如下 CURRENT_TIMESTAMP为表添加索引 ALTER table tableName ADD INDEX indexName(columnName)追加外键 ALTER TABLE tb_commentPhoto ADD CONSTRAINT FK_comment_ph…