Los tipos de valor son los más simples de los dos. Los tipos de valor se utilizan a menudo para representar los datos en sí. Un entero, un booleano o un punto en el espacio 3D son ejemplos de tipos de buen valor.
Los tipos de valor (estructuras) se declaran utilizando la palabra clave struct. Consulte la sección de sintaxis para ver un ejemplo de cómo declarar una nueva estructura.
En términos generales, tenemos 2 palabras clave que se utilizan para declarar tipos de valor:
Los tipos de referencia son un poco más complejos. Los tipos de referencia son objetos tradicionales en el sentido de programación orientada a objetos. Por lo tanto, admiten la herencia (y los beneficios de la misma) y también admiten los finalizadores.
En C # generalmente tenemos estos tipos de referencia:
Los nuevos tipos de referencia (clases) se declaran usando la palabra clave class. Para ver un ejemplo, consulte la sección de sintaxis para saber cómo declarar un nuevo tipo de referencia.
Las principales diferencias entre los tipos de referencia y los tipos de valor se pueden ver a continuación.
Esta es la diferencia que se menciona a menudo entre los dos, pero en realidad, a lo que se reduce es que cuando se usa un tipo de valor en C #, como un int, el programa usará esa variable para referirse directamente a ese valor. Si dice que int mine = 0, entonces la variable mine se refiere directamente a 0, lo cual es eficiente. Sin embargo, los tipos de referencia realmente mantienen (como sugiere su nombre) una referencia al objeto subyacente, esto es similar a los punteros en otros lenguajes como C ++.
Puede que no note los efectos de esto inmediatamente, pero los efectos están ahí, son poderosos y sutiles. Consulte el ejemplo sobre cómo cambiar los tipos de referencia en otro lugar para ver un ejemplo.
Esta diferencia es la razón principal de las siguientes diferencias y vale la pena conocerla.
Cuando se pasa un tipo de valor a un método como un parámetro, si el método cambia el valor de alguna manera, el valor no se cambia. Por el contrario, pasar un tipo de referencia a ese mismo método y cambiarlo cambiará el objeto subyacente, de modo que otras cosas que usen ese mismo objeto tendrán el objeto recién cambiado en lugar de su valor original.
Vea el ejemplo de los tipos de valor frente a los tipos de referencia en los métodos para obtener más información.
¿Qué pasa si quiero cambiarlos?Simplemente páselos a su método usando la palabra clave "ref", y luego está pasando este objeto por referencia. Es decir, es el mismo objeto en la memoria. Así que las modificaciones que hagas serán respetadas. Ver el ejemplo en pasar por referencia para un ejemplo.
Casi como dice, puede asignar nulo a un tipo de referencia, lo que significa que la variable que ha asignado no puede tener ningún objeto real asignado. En el caso de los tipos de valor, sin embargo, esto no es posible. Sin embargo, puede usar Nullable para permitir que su tipo de valor sea anulable, si este es un requisito, aunque si esto es algo que está considerando, piense con firmeza si una clase podría no ser el mejor enfoque aquí, si es el suyo. tipo.