Miembros de instancia

La declaración de una clase funciona como una plantilla o plano. A partir de ella puedes crear todas las instancias de clase que necesites.

Miembros de instancia: Cada instancia de una clase es un elemento independiente con su propio conjunto de datos, separado de otras instancias del mismo tipo. Se denominan miembros de instancia porque están asociados a objetos de la clase.

Miembros estáticos: El tipo predeterminado son los miembros de instancia. También puedes declarar miembros estáticos, los cuales pertenecen a la clase en sí misma y no a sus instancias. Lo veremos en próximas lecciones.

Veamos un ejemplo práctico

class Program
{
    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();
    }
}

class Factory
{

}

class Robot
{
    public string name;

    public void SayHello()
    {
        Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
    }
}Lenguaje del código: C# (cs)

En este ejemplo hay dos clases: Factory y Robot. La clase Robot contiene un método y un campo llamado name. Factory no tiene el campo name.

La función principal crea una instancia de Factory y tres instancias de Robot.

Analicemos la estructura de almacenamiento en memoria.

Los tres robots robot1, robot2 y robot3 tienen cada uno su propio valor name, guardado en posiciones de memoria distintas sin interferencias. Modificar robot1 no afecta a robot2.

    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();

        robot1.name = "Tom"; //Cada name es independiente, no se afectan mutuamente
        robot2.name = "Jack";
        robot3.name = "Smith";
    }Lenguaje del código: C# (cs)

Solo existe una copia de los miembros de función

Como sucede con name, cada instancia conserva su valor propio. Cambiar el valor de una instancia no modifica el de otra. Además de campos, las clases cuentan con miembros de función.

¿Los miembros de función dentro de una clase existen una única copia compartida por todas las instancias?

El cuerpo del código de una función (método): solo hay una copia global y todas las instancias la comparten

Tras la compilación, las instrucciones de máquina de los métodos se almacenan en la Tabla de Métodos (Method Table), asociada al tipo. Todas las instancias de esa clase en el montón comparten este mismo código; no se duplica la función para cada objeto.

Tomemos como ejemplo el método SayHello dentro de Robot

class Robot
{
    public string name;

    public void SayHello()
    {
        Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
    }
}Lenguaje del código: C# (cs)

La memoria cuenta con otras regiones además del montón y la pila. Los métodos se guardan concretamente en la Method Table.

Las funciones de clase residen en la tabla de métodos. Al invocarlas se ejecuta ese código compartido por todas las instancias.

    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();

        robot1.name = "Tom";
        robot2.name = "Jack";
        robot3.name = "Smith";

        robot1.SayHello();
        robot2.SayHello();
        robot3.SayHello();
    }Lenguaje del código: C# (cs)

En el código anterior, las tres llamadas a SayHello ejecutan la misma función. Sin embargo, las variables locales son independientes y el acceso a campos depende de qué instancia realice la llamada.

    public void SayHello()
    {
        Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
    }Lenguaje del código: C# (cs)

Cuando robot1 llama a SayHello, name vale Tom; cuando robot2 lo invoca, name vale Jack, y así sucesivamente.

Miembros de instancia

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *