Comparteix a través de


CA1846: Preferencia de AsSpan sobre Substring

Propiedad Valor
Identificador de la regla CA1846
Título Prefiere AsSpan sobre Substring
Categoría Rendimiento
La corrección interrumpe o no interrumpe Sin interrupción
Habilitado de forma predeterminada en .NET 10 Como sugerencia
Idiomas aplicables C# y Visual Basic

Causa

El resultado de invocar a una de las sobrecargas de 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 en el rendimiento para muchos programas. La asignación de muchas cadenas efímeras en una ruta crítica puede crear suficiente presión de recolecció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 APIs 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