C#, Recursividad y Stack????

12/11/2003 - 03:00 por Alejandro Tamayo | Informe spam
En otros lenguajes de programación como Pascal, por mencionar alguno, si se
crea una función que se llame recursivamente, los valores de los parámetros
se copian por tantos niveles tenga la recursividad. pero en C# cuando
hago esto con alguna clase definida por mi o simplemente con un arreglo, los
valores sde pasan como si fueran por referencia, es decir, si efectuo una
modificación en el nivel 10 de la recursividad, se le aplica a toda la
variable, y no he declarado ningun parametro como ref o out.

Es que C# está diseñado así? Hay alguna manera de que un arreglo que pase
por parámetro en un metodor recursivo se pase por valor?

Es decir:

void Metodo (int nivel, byte[] arreglo)
{
if (nivel==0) return; // Cualquier modificación al arreglo que yo haga
desde aqui se refleja hacia arriba.
Metodo(n-1,arreglo);
}

En C# el Stack o Pila de un metodo no pincha al igual que en Pascal o C++?

Preguntas similare

Leer las respuestas

#1 Michael Giagnocavo [MVP]
12/11/2003 - 05:25 | Informe spam
Eso depende del tipo que estas pasando. Si pasas un int (no por ref ni
out), los cambios no veras. Pero, si pasas un reference type (un objeto),
entonces solo se pasa la referencia a ese objeto. Si usas ref o out, estas
pasando una referencia a la referencia. byte[] es un System.Array, y es un
reference type.

Esto es para ahorrar recursos. Si quieres, cuando pasas tu byte[], puedes
hacer una copia y pasar eso. Por supuesto, consume mas memoria.

-mike
MVP

"Alejandro Tamayo" wrote in message
news:
En otros lenguajes de programación como Pascal, por mencionar alguno, si


se
crea una función que se llame recursivamente, los valores de los


parámetros
se copian por tantos niveles tenga la recursividad. pero en C# cuando
hago esto con alguna clase definida por mi o simplemente con un arreglo,


los
valores sde pasan como si fueran por referencia, es decir, si efectuo una
modificación en el nivel 10 de la recursividad, se le aplica a toda la
variable, y no he declarado ningun parametro como ref o out.

Es que C# está diseñado así? Hay alguna manera de que un arreglo que pase
por parámetro en un metodor recursivo se pase por valor?

Es decir:

void Metodo (int nivel, byte[] arreglo)
{
if (nivel==0) return; // Cualquier modificación al arreglo que yo haga
desde aqui se refleja hacia arriba.
Metodo(n-1,arreglo);
}

En C# el Stack o Pila de un metodo no pincha al igual que en Pascal o C++?


Respuesta Responder a este mensaje
#2 Alejandro Mezcua
12/11/2003 - 12:35 | Informe spam
Siguiendo con lo que te dice Michael, realmente estás pasando una copia de
la variable, pero la nueva variable, al ser una referencia, apunta al mismo
sitio.

Muchos objetos incluyen un método Clone, que te permite crear una copia con
la que trabajar en el escenario que planteas. Si la clase que quieres copiar
la has definido tú, puedes implementar el interface ICloneable para poder
realizar copias de tus propios objetos usando el mismo método que usa el
Framework.

Un saludo,

Alejandro Mezcua
MVP .NET
Zaltor Soluciones Informáticas

"Alejandro Tamayo" wrote in message
news:
En otros lenguajes de programación como Pascal, por mencionar alguno, si


se
crea una función que se llame recursivamente, los valores de los


parámetros
se copian por tantos niveles tenga la recursividad. pero en C# cuando
hago esto con alguna clase definida por mi o simplemente con un arreglo,


los
valores sde pasan como si fueran por referencia, es decir, si efectuo una
modificación en el nivel 10 de la recursividad, se le aplica a toda la
variable, y no he declarado ningun parametro como ref o out.

Es que C# está diseñado así? Hay alguna manera de que un arreglo que pase
por parámetro en un metodor recursivo se pase por valor?

Es decir:

void Metodo (int nivel, byte[] arreglo)
{
if (nivel==0) return; // Cualquier modificación al arreglo que yo haga
desde aqui se refleja hacia arriba.
Metodo(n-1,arreglo);
}

En C# el Stack o Pila de un metodo no pincha al igual que en Pascal o C++?


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida