2011-01-19 14 views
10

Mis preguntas son:En C#, el uso de los tipos de valor frente a los tipos de referencia

  • cuándo debemos utilizar los tipos de valor y tipos de referencia cuando?
  • ¿Cuáles son las ventajas y desventajas de una sobre otra?
  • ¿Qué ocurre si se utilizan tipos de referencia en todas partes? ¿Hay algún daño en eso?

También discuten las ventajas y desventajas de cada uno. Quiero entender eso también.

+2

Si no puede decidir, es casi seguro que es una "clase". Es increíblemente raro * legítimamente * escribir una estructura. –

+1

Para los programadores turcos, tengo una publicación en el blog sobre ella http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ –

Respuesta

4

Parece haber mucha confusión sobre esto, y Jon Skeet hace un buen trabajo al aclararlo en su libro "C# In Depth, 2nd Ed." (sección 2.3).

Mi enfoque personal, que puede o no ser correcto, es ÚNICAMENTE usar estructuras/enumeraciones (tipos de valores) para representar estructuras de datos atómicas ligeras que sé que usaré frecuentemente en algún tipo de lógica o matemática operaciones - piense en Point, etc.

De esta forma creo que puedo evitar la penalización del rendimiento de la recolección de basura. Sin embargo, Jon señala en esa sección de su libro que no hay garantía real, especialmente en las nuevas versiones del tiempo de ejecución, de si algo irá a la pila en absoluto.

Así que mi mejor respuesta es usar cosas como estructurar con moderación y ser muy consciente de por qué las estás usando si lo haces. Tenga cuidado con la optimización prematura. Y lea esa sección en el libro de Jon si puede conseguir una copia, porque hace un buen trabajo aclarando todo este tema.

relacionadas: When to use struct?

7

Usa tipos de valores para inmutables que no tienen una identidad propia (un 1 es un 1), usa tipos de referencia para otras cosas.

+5

¿Las cadenas de caracteres deben tener identidades? :) –

+0

Entonces un '" 1 "' no es un '" 1 "'? – jason

+0

@Jon - caso especial ... y se podría argumentar que las cadenas deberían haberse implementado como tipos de valores. Me encantaría escuchar tu opinión sobre eso. – Oded

9

Debe usar tipos de valores para los tipos de inmutables que representan valores.
Never make mutable structs.

Para todo lo demás, use tipos de referencia.

+1

+1 con énfasis en * small *. (copia-en-asignación) –

+1

su publicación no explica por qué uno debe usar tipos de valor? – Nawaz

2

http://www.albahari.com/valuevsreftypes.aspx

este es mi referencia en este punto. Principalmente uso tipos de referencia tbh. Clases IE y no estructuras. El punto principal que a menudo se dice es que las estructuras solo deben usarse para pequeñas piezas de información. Realmente depende de las circunstancias exactas. Eche un vistazo al .NET Framework en el navegador de objetos que debería ayudar, verá lo que han hecho los chicos de Microsoft y podrá analizar por qué crearon ciertas clases y estructuras.

1

Inmutable tipos de valor y tipos de referencia inmutables son semánticamente todos menos idéntica; las únicas diferencias son que los tipos de referencia soportan verificaciones de igualdad de referencia que pueden ser significativas o no, y que los tipos de valores pueden estar envueltos en un valor Nullable (De T) mientras que los tipos de referencia son anulables implícitamente. Si un tipo va a ser inmutable, dependiendo de cómo se utilizará, puede haber razones de rendimiento para favorecer una estructura o una clase; las estructuras son más rápidas para algunas operaciones (casi todas las operaciones, para tamaños inferiores a cuatro bytes), mientras que las clases pueden aparecer más rápidas para algunas otras (especialmente para objetos de más de 16 bytes). Además, algunos tipos de operaciones son esencialmente imposibles con las estructuras.

Los tipos de estructura mutable son útiles, al contrario de lo que afirman algunos detractores, pero hay algunas advertencias. Si uno tiene una variable que contiene una referencia a un objeto de clase mutable, y uno hace algo para cambiar ese objeto, ese cambio será efectivamente "visto" por todo lo que contiene una referencia a ese objeto. Si uno desea cambiar un objeto sin molestar a nada más, debe saber que uno tiene la única referencia a ese objeto. A menudo, la única forma de estar seguro de esto es copiar todos los datos del objeto en una nueva instancia de objeto y luego realizar el cambio a esa nueva instancia. Por el contrario, si uno tiene una estructura mutable, uno simplemente puede hacer los cambios que quiera sin tener que crear una nueva instancia.

El único problema real con las estructuras mutables es que .net usa varias abstracciones para hacer que se comporten como parte del sistema de tipo unificado, y estas abstracciones pueden hacer que se utilicen copias de estructuras en lugares donde los originales deberían usarse lógicamente . No siempre es obvio cuando estas sustituciones pueden ocurrir, y pueden conducir a un comportamiento confuso y erróneo.

Cuestiones relacionadas