Share via


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 8 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.

Vea también