C# 为什么高手喜欢用StartsWith而不是Substring进行字符串匹配?

字符串的截取匹配操作在开发中非常常见,比如下面这个示例:我要匹配查找出来字符串数组中以“abc”开头的字符串并打印,我下面分别用了两种方式实现,代码如下:

using System;namespace ConsoleApp23
{class Program{static void Main(string[] args){string[] strs = new string[] { "abc123" , "abc456" ,"ab123","a12345" };//方法1foreach (var str in strs){if (str.Substring(0, 3) == "abc"){Console.WriteLine(str);}}Console.WriteLine();//方法2 foreach (var str in strs){if (str.StartsWith("abc")){Console.WriteLine(str);}}Console.ReadKey();}}
}

运行结果如下:

041c0d4c6f9cd046dcbf89b12bcb14ee.png

诚然,两种方法都输出了正确的结果。

那么既然,两种方式都能实现,这两种方法有没有什么区别呢?当然有的,而且大多数时候,一个老练的程序员都会用StartsWith而不是Substring,为什么呢?

往下看,我把数据源修改下:

static void Main(string[] args){string[] strs = new string[] { "abc123" , "abc456" ,"ab123","a12345" ,"abc","ab"};//方法1foreach (var str in strs){if (str.Substring(0, 3) == "abc"){Console.WriteLine(str);}}Console.WriteLine();//方法2 foreach (var str in strs){if (str.StartsWith("abc")){Console.WriteLine(str);}}Console.ReadKey();}

运行后,方法一直接崩了,但是方法2则可以正确运行出来结果

33aab6472afea4399e13fd240debe98e.png

看一下Substring的用法解释:startIndex 加 length 指示不在此实例内的位置。- 或 - startIndex 或 length 小于零。,所以当字符串小于你要截取的长度时,你如果没用try catch去捕获异常,代码就崩溃了.

//// 摘要://     从此实例检索子字符串。子字符串从指定的字符位置开始且具有指定的长度。//// 参数://   startIndex://     此实例中子字符串的起始字符位置(从零开始)。////   length://     子字符串中的字符数。//// 返回结果://     与此实例中在 length 处开头、长度为 startIndex 的子字符串等效的一个字符串;如果 System.String.Empty 等于此实例的长度且//     startIndex 为零,则为 length。//// 异常://   T:System.ArgumentOutOfRangeException://     startIndex 加 length 指示不在此实例内的位置。- 或 - startIndex 或 length 小于零。[SecuritySafeCritical]public String Substring(int startIndex, int length);

所以,我们需要慎用Substring,如果非要用,一定需要进行异常处理。

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

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

相关文章

Nginx 服务器开启status页面检测服务状态

原文:http://www.cnblogs.com/hanyifeng/p/5830013.html 一、Nginx status monitor 和apache 中服务器状态一样。输出的内容如: 第1列: 当前与http建立的连接数,包括等待的客户端连接:2第2列:接受的客户端连…

在OpenCloudOS 上安装.NET 6

开源操作系统社区 OpenCloudOS 由腾讯与合作伙伴共同倡议发起,是完全中立、全面开放、安全稳定、高性能的操作系统及生态。OpenCloudOS 沉淀了多家厂商在软件和开源生态的优势,继承了腾讯在操作系统和内核层面超过10年的技术积累,在云原生、稳…

java产生的数字发送到页面_JAVA中数字证书的维护及生成方法

Java中的keytool.exe可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书…

IDEA破解 2017 IDEA license server 激活(可用)

进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.PHP(注意:php要小写)即可~ 转载于:https://www.cnblogs.com/austinspark-jessylu/p/7232982.html

《ASP.NET Core 6框架揭秘》实例演示[20]:“数据保护”框架基于文件的密钥存储...

《数据加解密与哈希》演示了“数据保护”框架如何用来对数据进行加解密,而“数据保护”框架的核心是“密钥管理”。数据保护框架以XML的形式来存储密钥,默认的IKeyManager实现类型为XmlKeyManager。接下来我们通过模拟代码和实例演示的形式来介绍一下Xml…

使用msui的回到顶部的一个小问题

2019独角兽企业重金招聘Python工程师标准>>> 回到顶部,一直没反应。 zepto加了动画后,依然如此。原生写法,jquery写法,仍然没有反应。 排查了后,发现获取的对象错误。手机端上,滚动到顶部&#…

口袋精灵加速版java_口袋妖怪TCG!口袋对决加速版教程(免ROOT)

原标题:口袋妖怪TCG!口袋对决加速版教程(免ROOT)《口袋对决》是一款以口袋精灵对战为核心玩法的集换式卡牌游戏,原汁原味的口袋画风,丰富多彩的各系精灵,策略竞技的属性相克。在5分钟一局的卡牌对战中,你将…

C#发布程序添加其他程序文件

注:程序发布文件,默认只发布自身程序直接引用的相关文件(A程序)。 如果需要添加其他程序(不同的应用程序B)文件,操作方法如下: 第一步:将B程序文件复制到A程序 第二步:将B程序文件右键--》属性做如下更改&a…

k8s 读书笔记 - 初始化容器 Init Container

Init Container 概述Init Container(Init 容器) 是一种特殊容器,在 Pod 内的应用容器启动之前运行,执行相关的初始化操作。Init 容器可以包括一些应用镜像中不存在的 实用工具 和 安装脚本 。每个 Pod 中可以包含一个或多个容器&a…

捕获 BackgroundService 中的异常 | 学学官方是如何实现的

前言上次,我们实现了《使用“装饰者模式”捕获 BackgroundService 中的异常》。结果发现,微软已经发现了这个问题,并在 .NET 6 中解决了。(囧)让我们验证一下:using IHost host Host.CreateDefaultBuilder…

使用badboy录制脚本 结合Jmeter一起测试。

1.badboy介绍 Badboy是一款不错的Web自动化测试工具,如果你将它用于非商业用途,或者用于商业用途安装Badboy 的机器数量不超过5台,你是不需要为它支付任何费用的。Badboy提供了将Web测试脚本直接导出生成JMeter 脚本的功能,并且这…

centOS下安装jdk1.8

2019独角兽企业重金招聘Python工程师标准>>> 本文记录了在vm下安装的centOS7下安装jdk1.8的过程 需要的工具及jdk: jdk-8u171-linux-x64.tar.gz 可以到官网去下 cecureFX 用于文件的传输 过程: 本次centOS7使用VMware Workstation 14 P…

盘点大厂的那些开源项目 - 滴滴出行

滴滴出行是涵盖出租车、 专车、滴滴快车、 顺风车、代驾及大巴、货运等多项业务在内的一站式出行平台。Nightingale 夜莺分类:监控系统夜莺是一套分布式高可用的运维监控系统,最大的特点是混合云支持,既可以支持传统物理机虚拟机的场景&#…

阿里巴巴发布智能运维故障管理AI+生态计划

摘要: 为响应马老师“家国情怀,世界担当”的号召,开放“AI”生态计划,将让集团内部服务过程中积累下的技术与经验更好地回馈社会,任何企业或合作伙伴均可以简单方便的接入阿里巴巴智能故障管理平台,通过对接…

k8s 读书笔记 - Pod 的升级和回滚

Pod 升级可能面临的问题当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有 Pod,然后下载新版本镜像并创建新的 Pod。但是当集群规模比较庞大时,那么这个工作就会变成一个挑战,而且先全部停止然后再逐步升级的方式…

《ASP.NET Core 6框架揭秘》实例演示[21]:如何承载你的后台服务

借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这…

使用DBCA工具创建自己的数据库

ylbtech-Oracle:使用DBCA工具创建自己的数据库 DBCA创建数据库 默认安装的Oracle数据库一般不能满足实际应用的需求,例如数据库名称、数据库块的大小等都需要修改,那么我们应该自己创建一个满足实际应用系统需要的Oracle数据实例(…

免去架构算法调优,如何让你的系统风驰电掣?|图说

通用计算场景下的云服务器领域从来都是兵家必争之地,价格战曾打了一波又一波,可用户痛点却依然是“顽疾”。由于采用的基础硬件、架构和调优技术千差万别,类似配置的云服务器之间存有较大的性能差异。 但市面上五花八门的云服务器不绝于耳&am…

记一次 .NET 某数控机床控制程序 卡死分析

一:背景 1. 讲故事前段时间有位朋友微信上找到我,说它的程序出现了卡死,让我帮忙看下是怎么回事? 说来也奇怪,那段时间求助卡死类的dump特别多,被迫训练了一下对这类问题的洞察力 😄&#x1f60…

ASP.NETCoreWeb开发之OptionsPattern

这节我们来讲一下,在ASP.NET Core Web开发中,读取配置文件信息的新方式:Options。前言 /Options在ASP.NET Web框架中,我们读取配置文件中的数据,在不使用第三方框架的情况下,可能需要通过ConfigurationMana…