none
Agenda de objetos en c# (principiante) RRS feed

  • Pregunta

  • Hola a todos y todas!!

    Soy nuevo programando en C# y también nuevo programando en orientación a objetos, antes había programado a un nivel muy básico en c++ y algo un poco más amplio (poco más) en php.

    Estoy aprendiendo por mi cuenta c# y voy un poco liado, pero voy aclarando conceptos... Intenté hacer una agenda de objetos para practicar, recuerdo que una de las practicas donde más aprendí en c++ era hacer una agenda con funciones y con un struct, así que he querido "repetir" esa experiencia pero con clases y métodos.

    El objetivo es hacer una clase persona con atributo dni, nombre y edad y crear un objeto de esa clase llamado person[x] donde x es el nombre de usuarios que se va incrementando cada vez que llamo añadir, de esa forma podría con una matriz del mismo objeto tener todos los usuarios y no hacer un objeto por persona, porque esa forma realmente no la veo para desarrollarla ¿crear un bucle que haga a su vez objetos? 

    Seguramente tenga conceptos mal y algunas cosas mal planteadas pero me gustaría ver si es posible lo que planteo, a pesar de que podría utilizar una estructura o hacerlo con una list, la intención es probar cosas.

            public string Añadir()
            {
                int cant = cantidad;
                cantidad++;
                          
                persona[] person = new persona[cantidad]; // creamos un objeto de arrays de 1 valor, iremos sumando cada vez que se invoca el metodo
                person[cant] = new persona(); // creamos el objeto posición 0, lo invocamos para darle valores.
                Console.Write("Nombre: ");
                person[cant].nombre = Console.ReadLine();
                Console.Write("DNI: ");
                person[cant].dni = Console.ReadLine();
                Console.Write("Edad: ");
                person[cant].edad = int.Parse(Console.ReadLine());

                return person[cant]; // no funciona.
               

            }

    Tengo este código para sumar 1 en el espacio de la memoria (array de objetos) aunque no sé si eso es correcto realizarlo ni que uso puedo darle, el caso es que le sumo uno y añado en nombre, dni y edad sus valores introducidos por el usuario, todo va bien pero no puedo hacer el return, tampoco puedo guardarlo en un atributo de la clase principal. de esta forma cuando llamo al método para consultar los datos esos datos introducidos se han volatilizado y no se quedan guardados, por eso quería guardarlos en un atributo accesible por todos o al menos hacer un return para guardarlo de esa forma.

    Como veréis tengo los conceptos un poco dispersos...

    ¿alguna ayuda?

    miércoles, 17 de octubre de 2018 16:28

Respuestas

  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    miércoles, 17 de octubre de 2018 16:46
  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    Gracias por tu ayuda! Tenía en cuenta lo que dices aunque aún no lo había intentado desarrollar.

    Cuando me dices que no se suelen utilizar matrices de objetos del mismo tipo, es porque es inviable o porque es poco efectivo? en realidad lo único que quería era probar cosas aunque haya maneras más rápidas o mejores de hacer las cosas como esto que me dices

    ¿cómo se haría con una matriz de objetos? de todas formas haré lo que me has puesto, que era el paso que quería hacer después de desencallar esta duda jaja

    P.edad = int.Parse(Console.ReadLine().ToString());

    No entiendo mucho la utilidad del ToString en un int

    un saludo y de nuevo gracias por tu ayuda!

    jueves, 18 de octubre de 2018 7:48
  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    Gracias por tu ayuda! Tenía en cuenta lo que dices aunque aún no lo había intentado desarrollar.

    Cuando me dices que no se suelen utilizar matrices de objetos del mismo tipo, es porque es inviable o porque es poco efectivo? en realidad lo único que quería era probar cosas aunque haya maneras más rápidas o mejores de hacer las cosas como esto que me dices

    ¿cómo se haría con una matriz de objetos? de todas formas haré lo que me has puesto, que era el paso que quería hacer después de desencallar esta duda jaja

    P.edad = int.Parse(Console.ReadLine().ToString());

    No entiendo mucho la utilidad del ToString en un int

    un saludo y de nuevo gracias por tu ayuda!

    int.Parse(text): esta función espera un parámetro de tipo String. ToString() convierte un objeto en String, aunque en este caso no es necesario porque ReadLine() devuelve un string.

    Con matrices también se puede hacer, solo hay que corregir algunas cositas de las que pusiste, por ejemplo, no definir la matriz dentro del método Añadir() porque te va a crear una nueva matriz cada vez que añadas un nuevo objeto. Te doy un ejemplo:

    private persona[] person;
    private int posicion;
    private int cantidad;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        posicion = 0;
        catidad = ObtenerCantidad();
        person = new persona[cantidad]; 
          
    }
    
    private void btnAgregar_Click(object sender, EventArgs e)
    {
        if (posicion == cantidad)
        {
            //Notificar que ya no se puede agregar.
            return;
        }
        Añadir();
    }
    
    private Añadir()
    {             
        persona p = new persona(); 
        Console.Write("Nombre: ");
        p.nombre = Console.ReadLine();
        Console.Write("DNI: ");
        p.dni = int.Parse(Console.ReadLine());
        Console.Write("Edad: ");
        p.edad = int.Parse(Console.ReadLine());
        
        person[posicion] = p;
        posicion = posicion +1;
    }

    Muchísimas gracias por tu ayuda, ahora lo he entendido perfectamente.

    Entiendo que btnAgregar y Form1 es la parte gráfica (aún no he miraod nada de eso) para mostrarlo y demás

    voy a hacer pruebas con eso y las listas, gracias de nuevo

    lunes, 22 de octubre de 2018 10:37
  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    Gracias por tu ayuda! Tenía en cuenta lo que dices aunque aún no lo había intentado desarrollar.

    Cuando me dices que no se suelen utilizar matrices de objetos del mismo tipo, es porque es inviable o porque es poco efectivo? en realidad lo único que quería era probar cosas aunque haya maneras más rápidas o mejores de hacer las cosas como esto que me dices

    ¿cómo se haría con una matriz de objetos? de todas formas haré lo que me has puesto, que era el paso que quería hacer después de desencallar esta duda jaja

    P.edad = int.Parse(Console.ReadLine().ToString());

    No entiendo mucho la utilidad del ToString en un int

    un saludo y de nuevo gracias por tu ayuda!

    int.Parse(text): esta función espera un parámetro de tipo String. ToString() convierte un objeto en String, aunque en este caso no es necesario porque ReadLine() devuelve un string.

    Con matrices también se puede hacer, solo hay que corregir algunas cositas de las que pusiste, por ejemplo, no definir la matriz dentro del método Añadir() porque te va a crear una nueva matriz cada vez que añadas un nuevo objeto. Te doy un ejemplo:

    private persona[] person;
    private int posicion;
    private int cantidad;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        posicion = 0;
        catidad = ObtenerCantidad();
        person = new persona[cantidad]; 
          
    }
    
    private void btnAgregar_Click(object sender, EventArgs e)
    {
        if (posicion == cantidad)
        {
            //Notificar que ya no se puede agregar.
            return;
        }
        Añadir();
    }
    
    private Añadir()
    {             
        persona p = new persona(); 
        Console.Write("Nombre: ");
        p.nombre = Console.ReadLine();
        Console.Write("DNI: ");
        p.dni = int.Parse(Console.ReadLine());
        Console.Write("Edad: ");
        p.edad = int.Parse(Console.ReadLine());
        
        person[posicion] = p;
        posicion = posicion +1;
    }

    Perdona que te moleste!!

    Veo claro el funcionamiento pero no entiendo el concepto de esto: public persona[] person; entiendo que creas una matriz del tipo persona que tendrá tantos campos como atributos tenga la clase, por eso podemos añadir p con sus campos automáticamente.

    Luego tuve que crear un constructor (nunca lo había hecho) imagino que porque tengo que inicializar la matriz.

    Salvo esta duda que me ha surgido creo que sería todo, siento ser tan pesado.

    lunes, 22 de octubre de 2018 14:19

Todas las respuestas

  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    miércoles, 17 de octubre de 2018 16:46
  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    Gracias por tu ayuda! Tenía en cuenta lo que dices aunque aún no lo había intentado desarrollar.

    Cuando me dices que no se suelen utilizar matrices de objetos del mismo tipo, es porque es inviable o porque es poco efectivo? en realidad lo único que quería era probar cosas aunque haya maneras más rápidas o mejores de hacer las cosas como esto que me dices

    ¿cómo se haría con una matriz de objetos? de todas formas haré lo que me has puesto, que era el paso que quería hacer después de desencallar esta duda jaja

    P.edad = int.Parse(Console.ReadLine().ToString());

    No entiendo mucho la utilidad del ToString en un int

    un saludo y de nuevo gracias por tu ayuda!

    jueves, 18 de octubre de 2018 7:48
  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    Gracias por tu ayuda! Tenía en cuenta lo que dices aunque aún no lo había intentado desarrollar.

    Cuando me dices que no se suelen utilizar matrices de objetos del mismo tipo, es porque es inviable o porque es poco efectivo? en realidad lo único que quería era probar cosas aunque haya maneras más rápidas o mejores de hacer las cosas como esto que me dices

    ¿cómo se haría con una matriz de objetos? de todas formas haré lo que me has puesto, que era el paso que quería hacer después de desencallar esta duda jaja

    P.edad = int.Parse(Console.ReadLine().ToString());

    No entiendo mucho la utilidad del ToString en un int

    un saludo y de nuevo gracias por tu ayuda!

    int.Parse(text): esta función espera un parámetro de tipo String. ToString() convierte un objeto en String, aunque en este caso no es necesario porque ReadLine() devuelve un string.

    Con matrices también se puede hacer, solo hay que corregir algunas cositas de las que pusiste, por ejemplo, no definir la matriz dentro del método Añadir() porque te va a crear una nueva matriz cada vez que añadas un nuevo objeto. Te doy un ejemplo:

    private persona[] person;
    private int posicion;
    private int cantidad;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        posicion = 0;
        catidad = ObtenerCantidad();
        person = new persona[cantidad]; 
          
    }
    
    private void btnAgregar_Click(object sender, EventArgs e)
    {
        if (posicion == cantidad)
        {
            //Notificar que ya no se puede agregar.
            return;
        }
        Añadir();
    }
    
    private Añadir()
    {             
        persona p = new persona(); 
        Console.Write("Nombre: ");
        p.nombre = Console.ReadLine();
        Console.Write("DNI: ");
        p.dni = int.Parse(Console.ReadLine());
        Console.Write("Edad: ");
        p.edad = int.Parse(Console.ReadLine());
        
        person[posicion] = p;
        posicion = posicion +1;
    }

    jueves, 18 de octubre de 2018 16:52
  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    Gracias por tu ayuda! Tenía en cuenta lo que dices aunque aún no lo había intentado desarrollar.

    Cuando me dices que no se suelen utilizar matrices de objetos del mismo tipo, es porque es inviable o porque es poco efectivo? en realidad lo único que quería era probar cosas aunque haya maneras más rápidas o mejores de hacer las cosas como esto que me dices

    ¿cómo se haría con una matriz de objetos? de todas formas haré lo que me has puesto, que era el paso que quería hacer después de desencallar esta duda jaja

    P.edad = int.Parse(Console.ReadLine().ToString());

    No entiendo mucho la utilidad del ToString en un int

    un saludo y de nuevo gracias por tu ayuda!

    int.Parse(text): esta función espera un parámetro de tipo String. ToString() convierte un objeto en String, aunque en este caso no es necesario porque ReadLine() devuelve un string.

    Con matrices también se puede hacer, solo hay que corregir algunas cositas de las que pusiste, por ejemplo, no definir la matriz dentro del método Añadir() porque te va a crear una nueva matriz cada vez que añadas un nuevo objeto. Te doy un ejemplo:

    private persona[] person;
    private int posicion;
    private int cantidad;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        posicion = 0;
        catidad = ObtenerCantidad();
        person = new persona[cantidad]; 
          
    }
    
    private void btnAgregar_Click(object sender, EventArgs e)
    {
        if (posicion == cantidad)
        {
            //Notificar que ya no se puede agregar.
            return;
        }
        Añadir();
    }
    
    private Añadir()
    {             
        persona p = new persona(); 
        Console.Write("Nombre: ");
        p.nombre = Console.ReadLine();
        Console.Write("DNI: ");
        p.dni = int.Parse(Console.ReadLine());
        Console.Write("Edad: ");
        p.edad = int.Parse(Console.ReadLine());
        
        person[posicion] = p;
        posicion = posicion +1;
    }

    Muchísimas gracias por tu ayuda, ahora lo he entendido perfectamente.

    Entiendo que btnAgregar y Form1 es la parte gráfica (aún no he miraod nada de eso) para mostrarlo y demás

    voy a hacer pruebas con eso y las listas, gracias de nuevo

    lunes, 22 de octubre de 2018 10:37
  • No se acostumbra usar matrices para almacenar objetos de un mismo tipo porque son mucho mas practicas y tienen mas funciones las listas tipadas. Podrias hacer algo así:

    Lista<persona> person= new Lista<persona>();
    
    
    public void Añadir()
      {                      
          persona p = new persona();
          Console.Write("Nombre: ");
          p.nombre = Console.ReadLine().ToString();
          Console.Write("DNI: ");
          p.dni = int.Parse(Console.ReadLine().ToString());
          Console.Write("Edad: ");
          P.edad = int.Parse(Console.ReadLine().ToString());
          person.Add(p);           
      }



    Gracias por tu ayuda! Tenía en cuenta lo que dices aunque aún no lo había intentado desarrollar.

    Cuando me dices que no se suelen utilizar matrices de objetos del mismo tipo, es porque es inviable o porque es poco efectivo? en realidad lo único que quería era probar cosas aunque haya maneras más rápidas o mejores de hacer las cosas como esto que me dices

    ¿cómo se haría con una matriz de objetos? de todas formas haré lo que me has puesto, que era el paso que quería hacer después de desencallar esta duda jaja

    P.edad = int.Parse(Console.ReadLine().ToString());

    No entiendo mucho la utilidad del ToString en un int

    un saludo y de nuevo gracias por tu ayuda!

    int.Parse(text): esta función espera un parámetro de tipo String. ToString() convierte un objeto en String, aunque en este caso no es necesario porque ReadLine() devuelve un string.

    Con matrices también se puede hacer, solo hay que corregir algunas cositas de las que pusiste, por ejemplo, no definir la matriz dentro del método Añadir() porque te va a crear una nueva matriz cada vez que añadas un nuevo objeto. Te doy un ejemplo:

    private persona[] person;
    private int posicion;
    private int cantidad;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        posicion = 0;
        catidad = ObtenerCantidad();
        person = new persona[cantidad]; 
          
    }
    
    private void btnAgregar_Click(object sender, EventArgs e)
    {
        if (posicion == cantidad)
        {
            //Notificar que ya no se puede agregar.
            return;
        }
        Añadir();
    }
    
    private Añadir()
    {             
        persona p = new persona(); 
        Console.Write("Nombre: ");
        p.nombre = Console.ReadLine();
        Console.Write("DNI: ");
        p.dni = int.Parse(Console.ReadLine());
        Console.Write("Edad: ");
        p.edad = int.Parse(Console.ReadLine());
        
        person[posicion] = p;
        posicion = posicion +1;
    }

    Perdona que te moleste!!

    Veo claro el funcionamiento pero no entiendo el concepto de esto: public persona[] person; entiendo que creas una matriz del tipo persona que tendrá tantos campos como atributos tenga la clase, por eso podemos añadir p con sus campos automáticamente.

    Luego tuve que crear un constructor (nunca lo había hecho) imagino que porque tengo que inicializar la matriz.

    Salvo esta duda que me ha surgido creo que sería todo, siento ser tan pesado.

    lunes, 22 de octubre de 2018 14:19

  • Veo claro el funcionamiento pero no entiendo el concepto de esto: public persona[] person; entiendo que creas una matriz del tipo persona que tendrá tantos campos como atributos tenga la clase, por eso podemos añadir p con sus campos automáticamente.

    Luego tuve que crear un constructor (nunca lo había hecho) imagino que porque tengo que inicializar la matriz.

    Salvo esta duda que me ha surgido creo que sería todo, siento ser tan pesado.

    La razón por la que he creado la matriz person al principio es para que esté visible en toda la clase, es más, al crearla como public estará visible también desde otras clases (si la case que la contiene es publica). Además si la hubiera creado dentro del método Añadir cada vez que se ejecuta ese método me crearía una nueva matriz y se perderían los datos cargados con anterioridad.

    No sé a que te referís cuando decís "...tendrá tantos campos como atributos tenga la clase..." Si te referís a la matriz, la respuesta es no, la matríz no tendrá campos, solo contendrá los objetos que se le agreguen como si fueran datos "simples". En otras palabras, la matriz no sabe que los objetos persona tienen propiedades, campos, etc.

    No has creado un constructor, lo has llamado (o invocado) en la linea "persona p = new persona()", aquí la palabra clave new sirve para invocar al constructor de la clase. Eso lo puse, como decis, para inicializar la matríz, lo podía poner al principio pero no daría la posibilidad de dimensionarla dinámicamente. 


    • Editado AntiWork miércoles, 24 de octubre de 2018 4:15
    miércoles, 24 de octubre de 2018 4:11