c# - visual - Estructuras de solo lectura vs clases



textbox solo lectura visual basic (1)

Las estructuras no deben considerarse como "objetos baratos"; tienen conjuntos de características similares que se superponen en algunas áreas y desunen en otras. Por ejemplo:

  • Las estructuras no pueden participar en el polimorfismo.
  • no puede tratar una estructura como una instancia de una interfaz sin encasillarla (advertencia: "llamada restringida", pero eso solo funciona en algunos escenarios)
  • muchas API de bibliotecas no funcionarán bien (o posiblemente funcionarán) con estructuras: esperan POCO mutables; probablemente querrá usar una biblioteca para obtener datos de una base de datos, serializarla o renderizarla en una interfaz de usuario: todas estas cosas se ahogan con las estructuras
  • Las estructuras no funcionan bien con algunos patrones, como las relaciones entre árboles o hermanos (un Foo no puede contener un Foo si es una estructura): hay otros
  • Las estructuras, y los tipos inmutables en general, pueden ser incómodos para trabajar con ellos.

Además, tenga en cuenta que hasta hace muy poco ("ref devuelve" y "ref locals") era muy difícil lograr algunas partes de "las estructuras de solo lectura le permiten copiar solo la referencia"; esto es ahora mucho más simple.

Pero, francamente, en la mayoría de los escenarios, los POCO son más fáciles de trabajar y están bien para la mayoría de los escenarios de código de aplicación.

Ciertamente hay momentos en que las estructuras son una opción increíble. Simplemente no es todo el tiempo . Sin embargo, apoyaría la idea de que si vas a usar una struct , debería ser una readonly struct (por defecto) o una ref struct (si sabes por qué lo estás haciendo); Las estructuras mutables sin ref son una receta para el dolor.

Suponiendo que solo tiene tipos inmutables y que tiene todo su código actualizado a C # 7.3 y sus métodos están usando la palabra clave in para entradas

¿Por qué usarías una clase en lugar de una estructura de solo lectura?

El inconveniente de usar structs fue que la copia era costosa, pero suponiendo que usted previene cualquier copia (copia defensiva del compilador o expresada por código), las estructuras de solo lectura le permiten copiar la referencia (como hacen las clases) y evitar la asignación de pilas y la presión sobre la basura coleccionista.

Si excluyes casos especiales (que supongo que podría ser un objeto muy grande que no cabe en la pila), ¿utilizarías la estructura de solo lectura como la primera opción normalmente?

El caso que me interesa es donde se utilizan como contenedores de datos.





.net