Las clases son tipos de referencia y las estructuras son tipos de valores.
Cuando digo que las clases son tipos de referencia,
básicamente contendrán la dirección de una variable de instancia.
Por ejemplo:
Class MyClass
{
Public Int DataMember; //By default, accessibility of class data members
//will be private. So I am making it as Public which
//can be accessed outside of the class.
}
En el método principal,
puedo crear una instancia de esta clase usando un nuevo operador que asigna memoria para esta clase
y almacena la dirección base de la misma en la variable de tipo MyClass (_myClassObject2).
Static Public void Main (string[] arg)
{
MyClass _myClassObject1 = new MyClass();
_myClassObject1.DataMember = 10;
MyClass _myClassObject2 = _myClassObject1;
_myClassObject2.DataMember=20;
}
En el programa anterior, MyClass _myClassObject2 = _myClassObject1; la instrucción indica que ambas variables de tipo MyClass
- myClassObject1
- myClassObject2
y apuntará a la misma ubicación de memoria.
Básicamente, asigna la misma ubicación de memoria a otra variable del mismo tipo.
Entonces, si cualquier cambio que hacemos en cualquiera de los objetos, escriba MyClass, tendrá un efecto en otro,
ya que ambos apuntan a la misma ubicación de memoria.
"_myClassObject1.DataMember = 10;" en esta línea, los miembros de datos del objeto contendrán el valor de 10.
"_myClassObject2.DataMember = 20;" en esta línea, tanto el miembro de datos del objeto contendrá el valor de 20.
Finalmente, estamos accediendo a los miembros de datos de un objeto a través de punteros.
A diferencia de las clases, las estructuras son tipos de valor. Por ejemplo:
Structure MyStructure
{
Public Int DataMember; //By default, accessibility of Structure data
//members will be private. So I am making it as
//Public which can be accessed out side of the structure.
}
Static Public void Main (string[] arg)
{
MyStructure _myStructObject1 = new MyStructure();
_myStructObject1.DataMember = 10;
MyStructure _myStructObject2 = _myStructObject1;
_myStructObject2.DataMember = 20;
}
En el programa anterior,
crea una instancia del objeto de tipo MyStructure usando un nuevo operador y
almacenando la dirección en la variable _myStructObject de tipo MyStructure y
asignando el valor 10 al miembro de datos de la estructura usando "_myStructObject1.DataMember = 10".
En la siguiente línea,
declaro otra variable _myStructObject2 de tipo MyStructure y asigno _myStructObject1 en eso.
Aquí el compilador .NET C # crea otra copia del objeto _myStructureObject1 y
asigna esa ubicación de memoria a la variable de MyStructure _myStructObject2.
Entonces, cualquier cambio que hagamos en _myStructObject1 nunca tendrá efecto en otra variable _myStructObject2 de tipo MyStructrue.
Es por eso que estamos diciendo que las estructuras son tipos de valor.
Entonces, la clase Base inmediata para la clase es Object y la clase Base inmediata para Structure es ValueType que hereda de Object.
Las clases admitirán una herencia, mientras que las estructuras no.
¿Cómo estamos diciendo eso?
¿Y cuál es la razón detrás de eso?
La respuesta es clases.
Puede ser abstracto, sellado, estático y parcial y no puede ser privado, protegido y protegido interno.