• Jueves 27 de Febrero de 2020, 20:21

Autor Tema:  Problema teorico con Ref y Out ..  (Leído 1726 veces)

whaitie

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Problema teorico con Ref y Out ..
« en: Sábado 20 de Agosto de 2011, 05:51 »
0
Miren, yo estoy leyendo de varios libros , en ingles y español, viendo videos tutoriales todo el dia, pero no logro cachar bien las palabras clave Ref y Out.

Segun entiendo , se usan para dar valores a variables , de otro valor de una variable Privada/Protegida, utilizando un metodo/constructor, o me equivoco ?

aka un codigo que tengo de ejemplo del libro , y luego voy a explicar que es lo que entiendo.

Código: [Seleccionar]
using System;


namespace RefYOut_Practica
{
    class Color
    {
        public Color()
        {
            this.red = 255;
            this.green = 0;
            this.blue = 125;
        }
        protected int red;
        protected int green;
        protected int blue;

        public void GetColors(out int red, out int green, out int blue)
        {
            red = this.red;
            green = this.green;
            blue = this.blue;
        }
    }
    class OutTestApp
    {
        public static void Main()
        {
            Color color = new Color();
            int red;
            int green;
            int blue;
            color.GetColors(out red, out green, out blue);
            Console.WriteLine("Rojo {0} , Verde {1} , Azul {2}", red, green, blue);
            Console.ReadKey();
        }
    }
}


Bueno lo que entiendo es lo siguiente:

Se crea un metodo llamado Color ( pero no se si tmb es un constructor por que tiene el mismo nombre, ahi me confunde sinceramente..) , luego se crean en la misma clase unas variables protegidas que son usadas en el Metodo/Constructor(??) "Color" , donde luego es creado un metodo llamado GetColors, el cual se le asigna nuevamente las variables protegidas, pero usando la palabra reservada "out".
Despues se crea el metodo Main para ejecutar nuestras Clases y Metodos, llamado "OutTestApp", donde se crea un objeto(que por eso creo que Color es un constructor mas que un Metodo, pero por las dudas pregunto, porq ue ya estan asignados los valores y me confunde), y que luego se vuelven a crear las variables "red","green" y "blue" , lo cual entiendo , que se crean estas variables publicas, para asignar el valor de las protegidas con la palabra reservada Out y el metodo GetColors() y luego simplemenete se imprime.

mis preguntas son :
1) Color es un Constructor?
2) El metodo GetColors se utiliza para que los datos almazenados de las variables puedan seguir usandose en otros metodos de la clase?
3)Ref es casi tecnicamente lo mismo que Out verdad?, pero cual seria su verdadero uso y cuando conviene más?.

4)Esto es lo que dice el libro, y en color azul señalo lo que no entiendo:

La unica diferencia entre las palabras reservadas "ref" y "out", es que la p/r(en adelante diremos q significa Plabra Reservada) Out es que la p/r Out no necesita que el codigo que invoca inicialice previamente los argumentos que se pasen.Entonces ¿Cuando debe utilizarse la palabra reservada ref?
Debería utilizarse cuando necesitemos asegurarnos de que el método que invoca ha inicizialiado el argumento


el argumento no es una matriz ?  :losiento: , no entiendo bien...  :ayuda:

si alguien pudiera responderme estas preguntas explicado de forma "Dummy" , "basica" , me estaria haciendo un grandisimo favor!

gracias a todos que lean y miren este post :)  :gracias:

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Problema teorico con Ref y Out ..
« Respuesta #1 en: Sábado 20 de Agosto de 2011, 21:08 »
0
Hola whaitie.

Es un gusto ver que te esfuerzas por aprender, rara vez veo gente en los foros que realmente les interesa aprender, la mayoria solo les interesa resolver la tarea, o que les den todo hecho, sin aprender nada en el proceso.

Por el tipo de preguntas que haces, me parece que es la primera vez que aprendes un lenguaje de programacion, asi que te haria la siguiente recomendacion, de ser posible, trata de llevar un curso o conseguir un tutor "en persona", esto te beneficiara mucho, ya que algunos temas son muy extensos para tratar en solo unas lineas de mensaje, ademas si te surgen dudas al momento, te las podran responder mucho mas rapido que por mensajes.

Dicho eso, tratare de responderte de la mejor manera posible, citando parrafos de tu mensaje original, preparate para un mensaje largo :)

Citar
Ref y Out.

Segun entiendo , se usan para dar valores a variables , de otro valor de una variable Privada/Protegida, utilizando un metodo/constructor, o me equivoco ?

Si entendi bien tu pregunta, diria que si estas un poco equivocado. Para que comprendas mejor, debo explicarte un poco sobre parametros, y por que se utilizan.

En los inicios de la programacion, se utilizaban variables globales, o sea variables que eran validas en todo el programa.  Conforme los programas fueron creciendo en complejidad y tamaño, usar variables globales se volvio un problema, ya que al ser validas en todo el programa, debias definir variables con nombre unico y diferente, pero en un programa muy largo, facilmente podias cometer el error de utilizar una variable que ya tuvieras definida para otra cosa y modificar su valor por accidente, acarreando problemas.

Despues surgio la programacion por modulos, en donde ya podias definir variables locales, validas solamente en el modulo donde estaban definidas. Pero estaba el problema de poder utilizar los valores de esas variables fuera del modulo, o tambien el poder utilizar valores definidos en un modulo, en otro modulo, sin utilizar variables globales, es ahi que surgieron los parametros, que permiten precisamente el paso de valores de un modulo a otro sin necesidad de usar variables globales.

Tenemos 2 tipos de parametro, por valor y por referencia.

En los parametros por valor, se copia el valor de la variable. Util cuando necesitamos un valor que este fuera del modulo, y no vamos a modificarlo, o no queremos que el valor modificado salga del modulo.

En los parametros por referencia. se pasa una referencia (o apuntador) a la variable original que esta fuera del modulo. Util cuando vamos a modificar el valor de la variable y necesitamos que el valor modificado salga del modulo. A esta categoria pertenecen las variables ref y out en C#.

Para el caso de C# y programacion orientada a objetos, modulo = metodo, a partir de ahora utilizare el termino metodo :)

Asi que regresando a tu pregunta, ref y out no solo se utilizan para dar valores de propiedades private/protected, sino que en general se utilizan, como dije antes, cuando necesitamos modificar el parametro y deseamos utilizar el valor modificado fuera del metodo, y no, no solo se utiliza en los constructores, sino en cualquier metodo.

Citar
1) Color es un Constructor?

Si, Color() es un constructor, pero dado que al parecer te confundes con eso, tratare de explicartelo.

Un constructor es un tipo especial de metodo, que se utiliza para "construir", es decir, inicializar el objeto cuando es creado (de ahi el nombre de constructor). Es en el constructor donde deberas colocar todo el codigo necesario para inicializar y preparar el objeto, incluido asignar valores a variables private/protected que necesitas que tengan un valor predeterminado, y que no esten en blanco, como es el caso de tu ejemplo.

Para identificar el metodo constructor, siempre tendra el mismo nombre del objeto, en este caso el objeto se llama Color, su constructor sera Color(). Si el objeto se llamara Cliente, su constructor seria Cliente(). Los constructores pueden tener parametros, pero no pueden regresar valores, ni tampoco ser pueden ser declarados como void o private. Ejemplo:

Código: [Seleccionar]
        // Ejemplo de constructor con parametros
        public Color(int rojo, int verde, int azul)
        {
            this.red = rojo;
            this.green = verde;
            this.blue = azul;
        }
        // Modo incorrecto de definir un constructor
        // no puede ser private ni void
        private void Cambio(int rojo, int verde, int azul)
        {
            //this.red = rojo;
            //this.green = verde;
            //this.blue = azul;
        }

El metodo constructor es llamado automaticamente cuando se crea el objeto, no necesitas llamarlo explicitamente, de hecho, si tratas de llamarlo manualmente te dara error.

Si no creas un constructor explicitamente, el compilador crea un constructor vacio por defecto.

Citar
2) El metodo GetColors se utiliza para que los datos almazenados de las variables puedan seguir usandose en otros metodos de la clase?

No, en este caso el objetivo del Metodo GetColors es acceder a los valores de las variables fuera de la clase, por eso estan definitos como out (parametros por referencia, lee mi respuesta anterior). Cualquier variable definida dentro de la clase, puede ser utilizada en toda la clase, a menos que la variable halla sido definida dentro de un metodo, en cuyo caso es local al metodo y solo valida dentro del mismo. Lo mismo pasa si la variable es definida dentro de un bloque, esa variable es local al bloque y no es valida fuera de ese bloque. aun cuando ese bloque este dentro de un metodo.

Un ejemplo de lo que dije antes:
Código: [Seleccionar]
        public void Variables()
        {
            // Variable i es local al metodo, no accesible fuera de el
            int i = 0;
           
            // La variable j es local al bloque for, no accesible
            // fuera de este bloque
            for (int j = 0; j < 5; j++)
            {
                Console.WriteLine(j);
            }

            // Esta linea dara error, ya que j solo era valida
            // en el bloque for
            Console.WriteLine(j);
        }

Mas informacion sobre variables: http://es.wikipedia.org/wiki/Variable_%28programaci%C3%B3n%29

Citar
3)Ref es casi tecnicamente lo mismo que Out verdad?, pero cual seria su verdadero uso y cuando conviene más?.

Pareciera que son lo mismo, pero no es asi.

Ambas sirven cuando necesitamos regresar valores de un metodo, pero ref se utiliza cuando necesitamos asegurarnos que la variable que le pasamos al metodo tiene un valor ya que pensamos utilizar ese valor dentro del metodo, pero ademas vamos a modificar esa variable, y out se utiliza cuando no importa o no necesitamos que la variable tenga un valor, ya que dentro del metodo le vamos a asignar el valor. ¿Confundido? Tratare de explicar porque se da esto y un ejemplo de su utilizacion.

Todo este asunto viene de los lenguajes antecesores de C#, C y C++. En C/C++ se utilizan apuntadores para implementar el paso de parametros por referencia (lee la explicacion de parametros arriba), pero un error muy comun de programacion en estos lenguajes es utilizar punteros sin asignar, o punteros nulos. Esto puede ser grave ya que las variables si no las asignamos explicitamente por lo general contienen valores aleatorios, que nos pueden dar resultados incorrectos en el mejor de los casos e incluso "congelar" la maquina en el peor de los casos.

Viendo esta problematica es que en Java (y C#) se implemento ref y out, de esa forma en tiempo de compilacion estas diciendo que tipo de uso le vas a dar al parametro, y si necesitas o no que el parametro tenga un valor previo.

Un ejemplo para que veas la diferencia, lee los comentarios, prueba modificando ref y out como menciono en los comentarios, para que veas mas claramente el efecto de ref y out.

Código: [Seleccionar]
    class Cambio
    {
        public Cambio()
        {
        }

        public static void Intercambio(ref int valor1, ref int valor2)
        {
            int temp;
            temp = valor2;
            valor2 = valor1;
            valor1 = temp;
        }

        public static void Asignar(out int a, out int b)
        {
            a = 1;
            b = 2;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int var1, var2;
           
            // Si utilizas ref en lugar de out
            // te dara error de variable local no asignada
            // ya que no has asignado valores a
            // var1 y var2
            Cambio.Asignar(out var1, out var2);
           
            // Si utilizas out en lugar de ref
            // te dara error de uso del parametro
            // out sin asignar, puesto
            // que no le estas asignando valores
            // dentro del metodo a las variables
            Cambio.Intercambio(ref var1, ref var2);
        }

Citar
4)Esto es lo que dice el libro, y en color azul señalo lo que no entiendo:

Esto esta relacionano con tu pregunta anterior, lee la respuesta anterior.

Citar
el argumento no es una matriz ?

Creo que no entendi muy bien esta pregunta, si estas diciendo que argumento es sinonimo de matriz, no, no es asi argumento mas bien es sinonimo de parametro. Si te refieres a que la lista de argumentos (parametros) de GetColor son una matriz, tampoco es cierto, son valores individuales, no es ni una matriz ni un vector.

Espero que con esto halla aclarado un poco tus dudas.

Saludos y suerte :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

whaitie

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re:Problema teorico con Ref y Out ..
« Respuesta #2 en: Sábado 20 de Agosto de 2011, 23:29 »
0
waaa , la verdad , la respuesta de un verdadero maestro ::amazing!::

y la verdad me gustaria poder hacer un curso de C#, pero en mi casa apenas llegamos a fin de mes... , y yo estoy estudiando al 100% C#, por que AMO la informatica, hace años que queria empezar a programar (tengo 20 recien cumplidos), y mi madre me esta aguantando que yo me dedique mucho a la programacion para salir adelante y no la pienso defraudar, ni por mi, ni por mi familia.

Y bueno por eso soy tan pregunton, me quiero sacar todas mis dudas, por que ser sabio no significa creerse que uno sabe todo, si no que aprende de sus errores , el de los demas, y el de los consejos de los maestros que puede encontrar en el camino, y asi algunas preguntas pueden dar verguenza, con tal de salir adelante, las pregunto.


Realmente me ha quedado todo bien claro, diria que haz explicado al 150% mejor que cualquiera de los libros que eh leido, es consiso, bien basico para los que comenzamos, si te hicieras un libro, trataria de hacerme del dinero para comprarlo jajaja.

lo que si , me darias una definicion de Argumentos de los metodos?, por que en la referencia del MSDN es el unico lugar dodne entrontre, pero la definicion me queda en "??¿¿" , y contigo la verdad que entiendo muy bien.

y otra cosa, C# aqui es muy caro, sobre que los cursos son escasos, abria otro idioma más comun que me recomendarias comenzar? , por que el unico que peude ser barato y conocido, es PHP.( ni siquiera hay casi de java como pra algo mas familiar a C#  :(  )


saludos

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Problema teorico con Ref y Out ..
« Respuesta #3 en: Domingo 21 de Agosto de 2011, 00:54 »
0
Citar
me darias una definicion de Argumentos de los metodos?

O te confundiste o no entiendo tu pregunta.

Si buscas definicion de argumento, ya te dije que es sinonimo parametro, significan los mismo, solo que en algunos textos le llaman argumentos, y en otros parametros.

http://es.wikipedia.org/wiki/Argumento_%28inform%C3%A1tica%29

Si no es esa tu pregunta, explicate mejor.

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================