CA1846: Preferencia de AsSpan
sobre Substring
Propiedad | Value |
---|---|
Identificador de la regla | CA1846 |
Título | Prefiere AsSpan sobre Substring |
Categoría | Rendimiento |
La corrección es problemática o no problemática | Poco problemático |
Habilitado de forma predeterminada en .NET 9 | Como sugerencia |
Causa
El resultado de una llamada a una de las sobrecargas String.Substring se pasa a un método con una sobrecarga disponible que acepta ReadOnlySpan<Char>
.
Descripción de la regla
Substring
asigna un nuevo objeto string
en el montón y realiza una copia completa del texto extraído. La manipulación de cadenas es un cuello de botella de rendimiento para muchos programas. La asignación de muchas cadenas pequeñas de corta duración en una ruta de acceso activa puede crear suficiente presión de recopilación para afectar al rendimiento. Las copias O(n) creadas por Substring
son pertinentes cuando aumenta el tamaño de las subcadenas. Los tipos Span<T> y ReadOnlySpan<T> se crearon para resolver estos problemas de rendimiento.
Muchas API que aceptan cadenas también tienen sobrecargas que aceptan un argumento ReadOnlySpan<System.Char>
. Cuando estas sobrecargas están disponibles, puede mejorar el rendimiento mediante una llamada a AsSpan
en lugar de a Substring
.
Cómo corregir infracciones
Para corregir una infracción de esta regla, reemplace la llamada a string.Substring
a por una llamada a uno de los métodos de extensión MemoryExtensions.AsSpan.
using System;
public void MyMethod(string iniFileLine)
{
// Violation
int.TryParse(iniFileLine.Substring(7), out int x);
int.TryParse(iniFileLine.Substring(2, 5), out int y);
// Fix
int.TryParse(iniFileLine.AsSpan(7), out int x);
int.TryParse(iniFileLine.AsSpan(2, 5), out int y);
}
Imports System
Public Sub MyMethod(iniFileLine As String)
Dim x As Integer
Dim y As Integer
' Violation
Integer.TryParse(iniFileLine.Substring(7), x)
Integer.TryParse(iniFileLine.Substring(2, 5), y)
' Fix
Integer.TryParse(iniFileLine.AsSpan(7), x)
Integer.TryParse(iniFileLine.AsSpan(2, 5), y)
End Sub
Cuándo suprimir las advertencias
Es seguro suprimir advertencias de esta regla si el rendimiento no supone un problema.