none
Cual es el beneficio de la estructura? RRS feed

  • Pregunta

  • He buscado información sobre estructuras y clases y hasta el momento entiendo que las estructuras son una especie de clases estáticas que se almacenan en pila y que cada vez que se pasa a una variable se crea una copia y por eso puede existir problemas de memoria.

    El asunto es que tengo una clase donde he puesto variables, propiedades y eventos estáticos para manejar la conexión a la un archivo xml que usa como base de datos pues son pocos registros ahi he puesto por ej: para crear el archivo, agregar al archivo, guardar el archivo.

     

    El asunto es en este caso ¿Es mejor crear una clase struct o una clase static como la tengo ahora?

     

    Bien, como notaran tengo poco conocimiento en la materia y les agradecería sus puntos de vista y explicaciones para aprender

     

    Gracias y saludos


    Edchar
    sábado, 23 de abril de 2011 2:05

Respuestas

  • Las estructuras se utilizan para representar tipos primitivos como int, double, vector,... cosas muy sencillas y a ser posible que sean inmutables y que sean muy pequenas.

    Algo que tiene variables, propiedades, eventos,... deberia ser una clase tal y como lo tienes ahora.


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    sábado, 23 de abril de 2011 3:57
  • No me he explicado muy bien la verdad. Por ejemplo, un Vector3D es un tipo que pega para un struct: es pequeno (son solo 3 numeros), compara su igualdad por valor y no por referencia, podria ser inmutable,... Y luego tendra sus metodos: sumar vectores, multiplicar vectores,...

    En general, todo son clases, el uso de una struct es para cosas muy determinadas (como tipos numericos, una fecha, un color,...). Si no lo tienes claro si algo deberia ser un struct, es que no deberia serlo, porque cuando pega que sea un struct esta clarisimo :)


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    sábado, 23 de abril de 2011 7:01
  • Por si te ayuda mas, mira lo que dice la MSDN sobre este tema:

    http://msdn.microsoft.com/es-es/library/ms173109.aspx

    En particular:

    "En general, las clases se utilizan para modelar comportamiento más complejo o datos que se piensan modificar una vez creado un objeto de clase. Los structs son más adecuadas para pequeñas estructuras de datos que contienen principalmente datos que no se piensan modificar una vez creado el struct."


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    sábado, 23 de abril de 2011 7:05
  •  

    Los objetos creados con base en  estructuras estan diseñadas para existir en el stack del programa, las clases en el Heap...

    por ende acceder a la memoria de un tipo estructura es mucho mas rapido que a la memoria de un tipo clase...

    las clases siempre pasan por referencia, las estructuras por valor.

    Ahora que si tienes una estructura y esta internamente tiene un objeto de tipo clase entonces la estructura tiene el apuntador a la clase en el stack, pero la clase esta en el heap ... asi que ahi se pierde la gracia.

    si tu objeto pesa máximo 16 bytes entonces puedes dejarlo en una estructura, con más de 16 bytes debes dejarlo como clase, esto por cuestiones de rendimiento. En un sistema x86 una estructura de 16 bytes puede ser

     

    stuct test
    {
      int a, b, c, d;
    }
    
    

     

    Adicionalmente para un control más granular con las estructuras puedes modificar la forma en que los datos se almacenan en memoria, permitiendo simular por ejemplo el tipo union de C++, esto se logra utilizando el atributo StructLayout.

    using System.Runtime.InteropServices;
    [StructLayout(LayoutKind.Explicit)]
    struct TestExplicit 
    {
      [FieldOffset(0)] 
      public long lg;
      [FieldOffset(0)] 
      public int i1;
      [FieldOffset(4)] 
      public int i2;
      [FieldOffset(8)] 
      public double d;
      [FieldOffset(12)] 
      public char c;
      [FieldOffset(14)] 
      public byte b1;
    }
    

    La estructura se recomienda máximo de 16 bytes si se hace con fin de obtener mas rendimiento, esto porque al pasarse por valor en cada paso a metodo o copia de la estructura, todo su contenido se copia en otra ubicacion de memoria, por lo cual una estructura de mas de 16 bytes puede causar un overhead en operaciones de memoria que invalidarian los beneficios generados por estar ubicada en el stack...

     

    si la velocidad, a estas micro escalas, no es algo muy relevante en tu app puedes omitir esto de los 16 bytes.

     


    Juan Carlos Ruiz Pacheco - Microsoft MVP Visual C#
    Visita mi blog:

    C#, XNA, Win32 - http://juank.black-byte.com

    Twitter: @JuanKRuiz
    Facebook: Arquitecto de Software

    viernes, 29 de abril de 2011 17:25
    Moderador

Todas las respuestas

  • Las estructuras se utilizan para representar tipos primitivos como int, double, vector,... cosas muy sencillas y a ser posible que sean inmutables y que sean muy pequenas.

    Algo que tiene variables, propiedades, eventos,... deberia ser una clase tal y como lo tienes ahora.


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    sábado, 23 de abril de 2011 3:57
  • Pero tengo entendido que las estructuras están capacitada para tener variables, propiedades, eventos.

     

    ¿En ese caso para que seria útil? ¿Que propósito tiene que tengan esa capacidad?

     

    Gracias por tu respuesta


    Edchar
    sábado, 23 de abril de 2011 4:24
  • Trabajar lo mejor posible, más fácil, más cómodo...

    http://electronica-pic.blogspot.com
    sábado, 23 de abril de 2011 6:43
  • No me he explicado muy bien la verdad. Por ejemplo, un Vector3D es un tipo que pega para un struct: es pequeno (son solo 3 numeros), compara su igualdad por valor y no por referencia, podria ser inmutable,... Y luego tendra sus metodos: sumar vectores, multiplicar vectores,...

    En general, todo son clases, el uso de una struct es para cosas muy determinadas (como tipos numericos, una fecha, un color,...). Si no lo tienes claro si algo deberia ser un struct, es que no deberia serlo, porque cuando pega que sea un struct esta clarisimo :)


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    sábado, 23 de abril de 2011 7:01
  • Por si te ayuda mas, mira lo que dice la MSDN sobre este tema:

    http://msdn.microsoft.com/es-es/library/ms173109.aspx

    En particular:

    "En general, las clases se utilizan para modelar comportamiento más complejo o datos que se piensan modificar una vez creado un objeto de clase. Los structs son más adecuadas para pequeñas estructuras de datos que contienen principalmente datos que no se piensan modificar una vez creado el struct."


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    sábado, 23 de abril de 2011 7:05
  • Disculpa mi preguntadera pero es que en esto soy nuevo y he encontrado la buena disposición de uds. a ayudar y por eso lo agradezco.

     

    Haber si he entendido, en ese caso yo tengo una propiedad que es un XDocument el cual no se modificara ya que contendrá la tabla (por decirlo así) RegPersonas,

    En ese caso ¿esto podría ir en un struct? algo como esto por ej.

     

            struct XmlDB
            {
                public static XDocument xml_RegPersona {get; set;}
            }

     

    El ejemplo anterior ¿Seria Correcto? si no ¿Que habría de cambiarle?

     

    Gracias Y saludos


    Edchar
    sábado, 23 de abril de 2011 13:18
  • No, eso deberia ser una clase (los structs deberian solo contener tipos primitivos, y XDocument es una clase).
    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    sábado, 23 de abril de 2011 13:34
  • Muchas Gracias por tu respuesta ya voy entendiendo.

     

    Pero por ultimo, ¿me podrías hacer el gran favor de ponerme un ejemplo practico donde se utilizaría un struct?

     

    Gracias y saludos


    Edchar
    sábado, 23 de abril de 2011 14:50
  • Por ejemplo un "Punto" en el espacio:

    public struct Punto
    {
      private int x;
      private int y;
    
      public int X { get { return this.x; } }
      public int Y { get { return this.y; } }
    
      public Punto(int x, int y)
      {
        this.x = x;
        this.y = y;
      }
    
      public static Punto operator+(Punto izq, Punto der)
      {
        return new Punto(izq.X + der.X, izq.Y + der.Y);
      }
    }
    
    Es pequeno (solo dos ints), solo contiene tipos primitivos, se parece a un numero en su uso (puedes sumar puntos, restar puntos,...).


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    sábado, 23 de abril de 2011 20:12
  • hola

    para ser bien concreto, el 99% de lo que codifiques van a ser clases, las estructuras salvo de forma muy puntual no creo que las uses, porque como comenta Vicente estas definen

    ya que el planteo que haces claramente es procesamiento y logica de negocio lo que estas definiendo, lo haces static porque simplemente es proceso del xml el que implementas y no requieres de una instancia

    ahora bien si la info de ese xml quieres devolverla como resultado, o sea no devuelvas un Xdocument, devuelve un objeto Persona

    o sea

    public static class XMLDB{

       public static List<Persona> RegPersona {get; set;}

    }

    ahi la cosa cambia bastante, y que XMLDB es static, peor ojo porque la clase Persona de la lista generica es instanciable porque cada instancia es unica y posee identidad

    public static class XMLDB{

       public static List<Persona> RegPersona {get; set;}

       public static void ProcesarXml(){

          this.RegPersona = new List<Persona>();

           Persona _persona = new Persona();

            //aqui procesar el xml y asignas las propeidade de la entidad persona

           _persona.Nombre = valor;

           _persona.Edad = valor;

          this.RegPersona.Add(_persona);

       }

    }

     

    public class Persona{

       public string Nombre {get; set;}

       public int Edad {get; set;}

    }

     

    como veras en el ejemplo la cosa cambio bastante, y todas son clases, es mas o menso asi como deberias trabjarlo, no devuelvas un XDocument porque este no refleja la funcionalidad, procesalo algo asm devilviendo entidades del negocio, asi haras mas rico el codigo y encapsulas el xml a solo una clase o sea XMLDB, que devuelve entidades del dominio

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 24 de abril de 2011 0:07
  • Muchas gracias a ambos por sus respuestas pues ahora tengo claro el uso de struct.

     

    Solo un asunto mas Leandro.

     

    Por lo que te entiendo me recomiendas que en vez de devolver un Xdocument que contiene la tabla de datos para los registros de las personas mas bien cree una clase con los registros de las personas y después de pesarle los datos que los manipuele mediante esta clase.

     

    ¿Es eso correcto?

    si es así ¿Por que es mejor para manipular los datos de un documento XML pasarlos a una clase en vez de usar un XDocument?.

     

    El asunto es que estoy usando el XDocument como si fuera una DB

     

    Muchas Gracias de nuevo

     


    Edchar
    domingo, 24 de abril de 2011 1:34
  • hola

    claro es correcto como lo has interprestado y las mejoras son basicamente

    - primero, porque devuelves informacion relacionada con tu negocio

    - segundo, encapsulas la responsabilidad de parsear el xml a una sola clase y no distribuyes la funcionalidad de trabjar com xml a todo tu codigo

    - trabajas con entidades tipadas, lo cual reduce notamente los errores, al devolver una entirdad "persona" esta tiene propiedades que definee  un tipo de dato concreto y al scribir en el VS el instellisense te ayuda para evitar errores

    - defines una capa de procesamiento del xml que abastrae desde resto de la aplcaicion como se debe tratar el xml, lo cual si algo cambia en la estructura del xml solo tocas a esta y el resto no se ve afectado

     

    como veras son muchas las razones para trabajar de esta forma y todas son muy buenas para otorgar estabildiad a la aplicacion

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 24 de abril de 2011 1:52
  • Muchas gracias a ambos por su excelente ayuda.

     

    Saludos y Gracia


    Edchar
    lunes, 25 de abril de 2011 1:58
  • Para dejar claro en resumen sobre las ventajas de las estructuras.

     

    Es más bien para organizarse.


    http://electronica-pic.blogspot.com
    lunes, 25 de abril de 2011 2:12
  • Para dejar claro en resumen sobre las ventajas de las estructuras.

     

    Es más bien para organizarse.


    http://electronica-pic.blogspot.com

    No, no, y no. E no 
    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    lunes, 25 de abril de 2011 11:58
  • Vaya. Gracias por aclarar.

    http://electronica-pic.blogspot.com
    lunes, 25 de abril de 2011 17:43
  • Vaya, no se que ha pasado con mi post anterior que falta la mitad. Pero vamos, que usar una estructura o usar una clase tiene implicaciones en el diseno, rendimiento, y uso de memoria de tu aplicacion. No es algo que se pueda tomar a la ligera. Lo bueno es que casi siempre lo que hay que usar son clases, y las estructuras se usan en situaciones muy determinadas.
    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    lunes, 25 de abril de 2011 20:43
  • Ahhhh. Entendí la forma de programar bien estructurado, bien hecho con bloques para que el programa sea muy legible y fácil de mantener.

     

    ;)


    http://electronica-pic.blogspot.com
    lunes, 25 de abril de 2011 20:44
  •  

    Los objetos creados con base en  estructuras estan diseñadas para existir en el stack del programa, las clases en el Heap...

    por ende acceder a la memoria de un tipo estructura es mucho mas rapido que a la memoria de un tipo clase...

    las clases siempre pasan por referencia, las estructuras por valor.

    Ahora que si tienes una estructura y esta internamente tiene un objeto de tipo clase entonces la estructura tiene el apuntador a la clase en el stack, pero la clase esta en el heap ... asi que ahi se pierde la gracia.

    si tu objeto pesa máximo 16 bytes entonces puedes dejarlo en una estructura, con más de 16 bytes debes dejarlo como clase, esto por cuestiones de rendimiento. En un sistema x86 una estructura de 16 bytes puede ser

     

    stuct test
    {
      int a, b, c, d;
    }
    
    

     

    Adicionalmente para un control más granular con las estructuras puedes modificar la forma en que los datos se almacenan en memoria, permitiendo simular por ejemplo el tipo union de C++, esto se logra utilizando el atributo StructLayout.

    using System.Runtime.InteropServices;
    [StructLayout(LayoutKind.Explicit)]
    struct TestExplicit 
    {
      [FieldOffset(0)] 
      public long lg;
      [FieldOffset(0)] 
      public int i1;
      [FieldOffset(4)] 
      public int i2;
      [FieldOffset(8)] 
      public double d;
      [FieldOffset(12)] 
      public char c;
      [FieldOffset(14)] 
      public byte b1;
    }
    

    La estructura se recomienda máximo de 16 bytes si se hace con fin de obtener mas rendimiento, esto porque al pasarse por valor en cada paso a metodo o copia de la estructura, todo su contenido se copia en otra ubicacion de memoria, por lo cual una estructura de mas de 16 bytes puede causar un overhead en operaciones de memoria que invalidarian los beneficios generados por estar ubicada en el stack...

     

    si la velocidad, a estas micro escalas, no es algo muy relevante en tu app puedes omitir esto de los 16 bytes.

     


    Juan Carlos Ruiz Pacheco - Microsoft MVP Visual C#
    Visita mi blog:

    C#, XNA, Win32 - http://juank.black-byte.com

    Twitter: @JuanKRuiz
    Facebook: Arquitecto de Software

    viernes, 29 de abril de 2011 17:25
    Moderador