Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CA1845:使用基于跨度的“string.Concat”

CA1845:使用基于跨度的“string.Concat”

作者头像
呆呆
发布于 2022-02-26 00:38:44
发布于 2022-02-26 00:38:44
39900
代码可运行
举报
文章被收录于专栏:centosDaicentosDai
运行总次数:0
代码可运行

规则 ID

CA1845

类别

“性能”

修复是中断修复还是非中断修复

非中断

原因

此规则查找包含 Substring 调用的字符串串联表达式,同时建议将 Substring 替换为 AsSpan 并使用基于跨度的 String.Concat 重载。

规则说明

调用 Substring 会生成提取的子字符串的副本。 通过使用 AsSpan 代替 Substring,并调用接受跨度的 string.Concat 重载,可以消除不必要的字符串分配。

如何解决冲突

若要解决冲突,请执行以下操作:

将字符串串联替换为对 string.Concat 的调用,以及

将对 Substring 的调用替换为对 AsSpan 的调用。

下面的代码片段显示了冲突示例及其解决方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
class Example
{
    public void Method()
    {
        string text = "fwobz the fwutzle";
        //  Violation: allocations by Substring are wasteful.
        string s1 = text.Substring(10) + "---" + text.Substring(0, 5);
        //  Fixed: using AsSpan avoids allocations of temporary strings.
        string s2 = string.Concat(text.AsSpan(10), "---", text.AsSpan(0, 5));
    }
}

何时禁止显示警告

不要禁止显示此规则的警告。 当提取的子字符串仅传递给具有基于跨度的等效项的方法时,没有理由在 AsSpan 上使用 Substring。

另请参阅

性能规则

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CA1846:首选 AsSpan 次选 Substring
对其中一个 String.Substring 重载的调用结果被传递给具有接受 ReadOnlySpan<Char> 的可用重载的方法。
呆呆
2022/02/26
9810
CA1831:在合适的情况下,为字符串使用 AsSpan 而不是基于范围的索引器
对字符串使用了范围索引器,并将值隐式分配给了 ReadOnlySpan<char>。
用户4268038
2022/02/19
1.2K0
性能规则
某个字段被声明为 static 和 read-only(在 Visual Basic 中为 Shared 和 ReadOnly),并使用可在编译时计算的值初始化。 因为赋给目标字段的值可在编译时计算,因此请将声明更改为 const(在 Visual Basic 中为 Const)字段,以便在编译时而非运行时计算值。
呆呆
2022/02/19
9260
CA1830:在 StringBuilder 上优先使用强类型 Append 和 Insert 方法重载。
调用 StringBuilder Append 或 Insert 方法时,使用的是对 Append 或 Insert 方法有专用重载的类型调用 ToString 生成的参数。
用户4268038
2022/02/19
4430
CA1832:使用 AsSpan 或 AsMemory 而不是基于范围的索引器来获取数组
对数组使用范围索引器并向 ReadOnlySpan<T> 或 ReadOnlyMemory<T> 隐式赋值。
用户4268038
2022/02/25
1.4K0
CA1847:对单个字符使用 string.Contains(char) 而不是 string.Contains(string)
当 string.Contains(char) 可用时使用 string.Contains(string)。
呆呆
2022/02/26
5480
CA1834:对单字符字符串使用 StringBuilder.Append(char)
使用单位长度字符串调用 StringBuilder.Append 时,请考虑使用 const char 而不是单位长度 const string 来提高性能。
用户4268038
2022/02/19
6100
代码质量规则
.NET 代码分析提供旨在提高代码质量的规则。 这些规则分为设计、全球化、性能和安全性等领域。 某些规则特定于 .NET API 用法,而其他规则与通用代码质量相关。
呆呆
2022/01/09
2.3K0
CA1827:如果可以使用 Any,请勿使用 Count/LongCount
在使用 Any 方法会更有效的情况下使用了 Count 或 LongCount 方法。
用户4268038
2022/02/19
6000
CA1841:首选字典包含方法
此规则可找到在 IDictionary<TKey,TValue> 的 Keys 或 Values 集合上对 Contains 方法的调用,这些调用可替换为在字典本身对 ContainsKey 或 ContainsValue 方法的调用。
呆呆
2022/02/26
3600
CA1054:URI 参数不应为字符串
类型声明一个方法,该方法具有名称中包含“uri”、“Uri”、“urn”、“Urn”、“url”或“Url”的字符串参数,且类型未声明采用 System.Uri 参数的相应重载。
呆呆
2022/01/10
6050
CA1828:如果可以使用 AnyAsync,请勿使用 CountAsync/LongCountAsync
在使用 AnyAsync 方法会更有效的情况下使用了 CountAsync 或 LongCountAsync 方法。
用户4268038
2022/02/19
6310
CA1826:使用属性,而不是 Linq Enumerable 方法
此规则在具有等效但更高效的属性的类型集合上标记 Enumerable LINQ 方法调用,以提取相同的数据。
用户4268038
2022/02/19
6570
String类详解(基础篇八)
String有很多重载的构造方法,这些方法支持很多类型的对象,例如:String、char[]、byte[]
故里
2020/11/25
4730
String类详解(基础篇八)
CA2013:请勿将 ReferenceEquals 与值类型结合使用
使用 System.Object.ReferenceEquals 方法来测试一个或多个值类型是否相等。
用户4268038
2022/02/20
1.2K0
CA1825:避免数组分配长度为零
初始化长度为零的数组将导致不必要的内存分配。 请改为通过调用 Array.Empty 方法来使用静态分配的空数组实例。 内存分配在此方法的所有调用之间共享。
用户4268038
2022/02/19
4530
CA2008:不要在未传递 TaskScheduler 的情况下创建任务
以下 .NET 任务创建和延续方法具有允许指定或省略 TaskScheduler 实例的重载:
呆呆
2022/02/26
5320
CA1720:标识符不应包含类型名称
参数和成员的名称更好地用于传达其含义而不是描述其类型,类型描述通常由开发工具提供。 对于成员的名称,如果必须使用数据类型名称,请使用与语言无关的名称,而不要使用语言特定的名称。 例如,请使用与语言无关的数据类型名称 Int32,而不要使用 C# 类型名称 int。
呆呆
2022/02/19
5160
CA1806:不要忽略方法结果
从未使用过的 COM 或 P/Invoke 方法,它返回 HRESULT 或错误代码。
呆呆
2022/02/19
9210
CA1838:不要对 P/Invoke 使用 StringBuilder 参数
StringBuilder 的封送处理总是会创建一个本机缓冲区副本,这导致一个 P/Invoke 调用出现多次分配。 若要将 StringBuilder 作为 P/Invoke 参数进行封送,运行时将:
用户4268038
2022/02/19
5500
推荐阅读
相关推荐
CA1846:首选 AsSpan 次选 Substring
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验