visual tutorial studio net español descargar asp c# .net-core

c# - tutorial - net core 3 release date



¿En qué se diferencia el nuevo C#Span<T> de ArraySegment<T>? (3)

De MSDN Magazine : Span se define de tal manera que las operaciones pueden ser tan eficientes como en las matrices: la indexación en un tramo no requiere cálculos para determinar el comienzo desde un puntero y su desplazamiento inicial, ya que el propio campo de referencia ya encapsula ambos . (Por el contrario, ArraySegment tiene un campo de desplazamiento separado, lo que hace que sea más costoso indexar y transferir).

Además, mientras que Array implementa IEnumerable , Span no.

Estoy teniendo problemas para conceptualizar los usos para el nuevo Span en C # .

  1. ¿Qué constructo (s) reemplaza? ¿Está ArraySegment ahora obsoleto?

  2. ¿Qué funcionalidad permite que antes no fuera?

  3. ¿Es Span un reemplazo válido para matrices C #? ¿En qué casos sí, en qué casos no?

  4. ¿Cuándo usaré un ArraySegment en lugar de un Span?

Estoy tratando de entender cómo deberán cambiar mis estilos de codificación para hacer un uso efectivo del nuevo Span.


Tenga también en cuenta al decidir si usar Span las limitaciones que se aplican a las refacciones en C #:

https://docs.microsoft.com/en-us/dotnet/api/system.span-1?view=netcore-2.2

Span es una estructura de referencia que se asigna en la pila en lugar de en el montón administrado. Los tipos de estructura de ref tienen una serie de restricciones para garantizar que no puedan ser promovidos al montón administrado, lo que incluye que no se pueden encuadrar, no pueden asignarse a variables de tipo Objeto, dinámicas o de cualquier tipo de interfaz, pueden No puede haber campos en un tipo de referencia, y no se pueden usar para esperar y producir límites. Además, las llamadas a dos métodos, Equals (Object) y GetHashCode, emiten una NotSupportedException.

Importante

Debido a que es un tipo de solo pila, Span no es adecuado para muchos escenarios que requieren el almacenamiento de referencias a los buffers en el montón. Esto es cierto, por ejemplo, de las rutinas que realizan llamadas de método asíncronas. Para tales escenarios, puede usar los tipos complementarios System.Memory y System.ReadOnlyMemory.

Para los tramos que representan estructuras inmutables o de solo lectura, use System.ReadOnlySpan.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ref?view=netcore-2.2#ref-struct-types

Agregar el modificador ref a una declaración de estructura define que las instancias de ese tipo deben ser asignadas por la pila. En otras palabras, las instancias de estos tipos nunca pueden crearse en el montón como miembro de otra clase. La motivación principal para esta característica fue Span y estructuras relacionadas.

El objetivo de mantener un tipo de estructura de referencia como una variable asignada a la pila introduce varias reglas que el compilador aplica para todos los tipos de estructura de referencia.

  • No puedes poner una estructura de ref.
  • No puede asignar un tipo de estructura de referencia a una variable de tipo objeto, dinámica o cualquier tipo de interfaz.
  • Los tipos de estructura ref no pueden implementar interfaces.
  • No puede declarar una estructura de referencia como miembro de una clase o una estructura normal .
  • No puede declarar variables locales que sean tipos de estructura de ref en métodos asíncronos. Puede declararlos en métodos sincrónicos que devuelven tareas, tareas o tipos similares a tareas.
  • No se pueden declarar variables locales de referencia en iteradores.
  • No puede capturar variables de estructura de ref en expresiones lambda o funciones locales.
  • Estas restricciones aseguran que no use accidentalmente una estructura de referencia de manera que pueda promocionarla al montón administrado.

Puede combinar modificadores para declarar una estructura como solo lectura ref. Una estructura de referencia de solo lectura combina los beneficios y restricciones de las declaraciones de ref estructura y de solo lectura.


Span<T> no reemplaza nada. Es el valor agregado. Proporciona una vista segura de tipos en segmentos continuos de memoria que se pueden asignar de muchas maneras diferentes: como una matriz administrada, una memoria basada en pila o una memoria no administrada.

ArraySegment<T> está limitado a matrices administradas. No puede usarlo para envolver los datos asignados en la pila usando stackalloc . Span<T> te permite hacer eso.

ArraySegment<T> tampoco proporciona una vista de solo lectura en la matriz subyacente. ReadOnlySpan<T> te da eso.

Span<T> no debe reemplazar los arreglos. Al final del día es solo una vista de los datos. Esos datos deben asignarse de alguna manera, y en el mundo administrado esa asignación, para la mayoría de los casos, será una asignación de matriz. Así que todavía necesitas matrices.

Debería usar Span<T> si desea que su código pueda manipular más que solo arreglos. Por ejemplo, considerar una biblioteca de análisis. En este momento, para permitir que funcione con arrays, apilar memoria asignada y memoria no administrada, debe proporcionar múltiples puntos de entrada en la API para cada uno de estos, y usar código no seguro para manipular realmente los datos. Es probable que también sea necesario exponer una API basada en string para que la usen las personas que tienen sus datos asignados como cadenas. Con Span y ReadOnlySpan puede combinar toda esa lógica en una única solución basada en Span que será aplicable en todos estos escenarios.

Span<T> definitivamente no va a ser algo que sea usado por todos y muy a menudo. Es una parte altamente especializada de .NET framework que es útil principalmente para los autores de bibliotecas y en escenarios críticos de alto rendimiento. Por ejemplo, Kestrel, el servicio web detrás de ASP.NET Core obtendrá muchos beneficios de rendimiento al pasar a Span<T> porque, por ejemplo, el análisis de la solicitud se puede realizar utilizando Span<T> y la memoria asignada a la pila, que no ejerce presión sobre el GC . Pero usted, la redacción de sitios web y servicios basados ​​en ASP.NET Core no tiene que usarlos.