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
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.
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:
// 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.
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:
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%293)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.
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);
}
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.
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