2. Manejo de Memoria
El problema con la memoria estática de memoria es que siempre se reserva antes de conocer los datos concretos del problema y esto origina reservar siempre un máximo de memoria que en la mayoría de las veces no se va a necesitar.
2.1.2 Manejo de memoria dinámica
Memoria dinámica:
La reserva de memoria dinámica se hace en tiempo de ejecución después de leer los datos y de conocer el tamaño exacto del problema. Como consecuencia se adapta mucho mejor a las necesidades en cada caso.
El sitio donde se almacenan los objetos se denominan en ingles heap o free store traducido como montículo o memoria libre, y el sitio preciso donde se encuentre depende del compilador y el tipo de puntero utilizado. La creación y estrucción de los objetos esta en manos del programador a través de los operadores new y delete.
En C# las variables que se declaran son punteros y se pasan eficientemente con referencia, tampoco es necesario considerar la liberación de la memoria puesto que framework se encarga de liberar todas las referencias que no se estén utilizando y compactar la memoria para mejorar el rendimiento.
En C# las clases es el componente básico del lenguaje y siempre se almacenan en el heap.
Ejemplo de una clase
public class MyClase
{
public MyClase() //Constructor default
{
sentencias;
}
public MyClase() //destructor
{
sentencias;
}
MyClase mine=new MyClase(); //instancia de la clase
}
El problema con la memoria estática de memoria es que siempre se reserva antes de conocer los datos concretos del problema y esto origina reservar siempre un máximo de memoria que en la mayoría de las veces no se va a necesitar.
2.1.2 Manejo de memoria dinámica
Memoria dinámica:
La reserva de memoria dinámica se hace en tiempo de ejecución después de leer los datos y de conocer el tamaño exacto del problema. Como consecuencia se adapta mucho mejor a las necesidades en cada caso.
El sitio donde se almacenan los objetos se denominan en ingles heap o free store traducido como montículo o memoria libre, y el sitio preciso donde se encuentre depende del compilador y el tipo de puntero utilizado. La creación y estrucción de los objetos esta en manos del programador a través de los operadores new y delete.
En C# las variables que se declaran son punteros y se pasan eficientemente con referencia, tampoco es necesario considerar la liberación de la memoria puesto que framework se encarga de liberar todas las referencias que no se estén utilizando y compactar la memoria para mejorar el rendimiento.
En C# las clases es el componente básico del lenguaje y siempre se almacenan en el heap.
Ejemplo de una clase
public class MyClase
{
public MyClase() //Constructor default
{
sentencias;
}
public MyClase() //destructor
{
sentencias;
}
MyClase mine=new MyClase(); //instancia de la clase
}
Nota: En el ejemplo anterior MyClase es tratada sintacticamenente como una referencia y no como un puntero
por lo tanto C# obliga a reservar la memoria dinámica para una instancia particular.
Tipos de referencias en C#
Object
String
Todas las clases
Tipos valor en C#
Tipos de predefinidos (int, flat....)
Estructuras
Enumeraciones
2.1.3 Ventajas de utilizar memoria dinámica vs memoria estática
La memoria dinámica sirve para que los programadores se adapten siempre al tamaño del problema que tienen que resolver sin desperdiciar recursos de memoria y esto se traduce en una mayor eficiencia en la ejecución de los programas, las ventajas de utilizar memoria dinámica se valoran mejor en comparación con la utilización de la reserva de la memoria estática, como se muestra en el siguiente cuadro.
" Click en la imagen para ampliar"
Ejemplos Extras de la aplicación de memoria dinámica y estática.
Ejemplos Extras de la aplicación de memoria dinámica y estática.
Ejemplo Aplicación Estática
using System;
using System.Collections.Generic;
using System.Text;
namespace MyEjemploEstatica
{
public class Empleado
{
public string id;
public string nombre;
public Empleado ()
{
}
public Empleado(string nombre, string id)
{
this.nombre = nombre;
this.id = id;
}
public static int ContadorEmpleado;
//Aplicacion de memoria estatica
public static int AgregarEmpleado()
{ return ++ContadorEmpleado;
}
}
class MainClass : Empleado
{
public static void Main()
{
Console.Write("Ingresa el nombre del empleado: ");
string nombre = Console.ReadLine();
Console.Write("Ingresa el Id del empleado: ");
string id = Console.ReadLine();
// Creando el objeto empleado:
Empleado e = new Empleado(nombre, id);
Console.Write("Ingresa el No. de empleados: ");
stng n = Console.ReadLine();
Empleado.ContadorEmpleado = Int32.Parse(n);
Empleado.AgregarEmpleado();
// Nueva informacion:
Console.WriteLine("Nombre: {0}", e.nombre);
Console.WriteLine("ID: {0}", e.id);
Console.WriteLine("Nuevo No. de empleados: {0}", Empleado.ContadorEmpleado);
Console.ReadLine();
}
}
}
Ejemplo Aplicación dinámica
using System;
using System.Collections.Generic;
using System.Text;
namespace MyEjeDinamica
{
public class Persona
{
public string nombre;
//constructor
public Persona()
{
nombre = "Desconocido";
//metodo
public void leerNombre(string nom)
{
nombre = nom;
}
}
class Program
{
static void Main(string[] args)
{
Persona persona1 = new Persona();
System. Console.WriteLine(persona1.nombre);
persona1.leerNombre( "Susana Martinez");
System. Console.WriteLine(persona1.nombre);
persona1.leerNombre( "Aurelio Rios");
System. Console.WriteLine(persona1.nombre);
persona1.leerNombre( "Arturo Corona");
System. Console.WriteLine(persona1.nombre);
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace MyEjeDinamica
{
public class Persona
{
public string nombre;
//constructor
public Persona()
{
nombre = "Desconocido";
//metodo
public void leerNombre(string nom)
{
nombre = nom;
}
}
class Program
{
static void Main(string[] args)
{
Persona persona1 = new Persona();
System. Console.WriteLine(persona1.nombre);
persona1.leerNombre( "Susana Martinez");
System. Console.WriteLine(persona1.nombre);
persona1.leerNombre( "Aurelio Rios");
System. Console.WriteLine(persona1.nombre);
persona1.leerNombre( "Arturo Corona");
System. Console.WriteLine(persona1.nombre);
Console.ReadLine();
}
}
}