Para acelerar su programa, debe (1) establecer objetivos significativos, (2) probar para ver si ha cumplido sus objetivos, (3) si no lo ha hecho, utilizar una herramienta de creación de perfiles para encontrar lo más lento y (4 ) optimizar lo más lento.
@EricLippert Tu comentario responde a la pregunta real del OP mucho mejor que cualquiera de las respuestas publicadas. Todos estaban tan distraídos por los tecnicismos de "pasar referencia por valor" que pasaron por alto por completo la pregunta real sobre la optimización del rendimiento. Desafortunadamente, el OP comunicó sus necesidades bastante mal, y las otras respuestas al menos ayudarán a la multitud de Google.
Dan Bechard
"otras respuestas ayudarán al menos a la multitud de Google", ¡lo harán! :)
miki
Respuestas:
208
La referencia se pasa por valor .
Las matrices en .NET son objetos en el montón, por lo que tiene una referencia. Esa referencia se pasa por valor, lo que significa que la persona que llama verá los cambios en el contenido de la matriz, pero la reasignación de la matriz no:
voidFoo(int[] data) {
data[0] = 1; // caller sees this
}
voidBar(int[] data) {
data = newint[20]; // but not this
}
Si agrega el refmodificador, la referencia se pasa por referencia , y la persona que llama verá cualquiera de los cambios anteriores.
La respuesta es correcta, pero odio como mascota a las personas que afirman que "la referencia se pasa por valor". Confunde el problema. Sí, las referencias (direcciones de memoria) se pasan por valor, pero esa no era la cuestión.
WernerVA
9
@WernerVA Estoy interesado en cómo crees que lo expresarías de manera diferente, eso sigue siendo correcto e inequívoco
Marc Gravell
2
No lo expresaría de manera diferente, solo tal vez con un poco más de detalle.
WernerVA
Esto no responde a la parte de velocidad de la pregunta. Probablemente sea obvio para usted que optimizar una copia de referencia será completamente insignificante en comparación con los cientos de otras operaciones mucho más costosas que se están llevando a cabo, pero el OP preguntó esto específicamente.
Dan Bechard
7
@Dan, la parte de velocidad está intrínsecamente vinculada a "si la matriz se pasa por valor, es decir, una copia del contenido de la matriz, eso significa una asignación y una copia de toda la memoria". Dado que es una referencia que se pasa, no hay ninguna pregunta de rendimiento que responder; esa parte de la pregunta se vuelve discutible y se responde automáticamente. Excepto que ahora también se responde aquí explícitamente en los comentarios ...
Marc Gravell
9
Se pasan por valor (al igual que todos los parámetros que no son ni ref ni out), pero el valor es una referencia al objeto, por lo que efectivamente se pasan por referencia.
Sí, se pasan por referencia de forma predeterminada en C #. Todos los objetos en C # lo son, excepto los tipos de valor. Para ser un poco más precisos, se pasan "por referencia por valor"; es decir, el valor de la variable que ve en sus métodos es una referencia al objeto original pasado. Este es un pequeño punto semántico, pero a veces puede ser importante.
La referencia se pasa por valor; que es muy diferente a "se pasan por referencia".
Marc Gravell
1
Esto es exactamente lo contrario de la verdad. Citando esta publicación de John Skeet : "De forma predeterminada, todos los parámetros se pasan por valor en C #. Los parámetros solo se pasan por referencia si incluye explícitamente un modificador out o ref. Sin embargo, debe tener en cuenta que cuando el tipo del parámetro es un tipo de referencia, está pasando una referencia en lugar de un objeto real ". Es solo la referencia (la dirección de memoria) que se pasa por valor.
Respuestas:
La referencia se pasa por valor .
Las matrices en .NET son objetos en el montón, por lo que tiene una referencia. Esa referencia se pasa por valor, lo que significa que la persona que llama verá los cambios en el contenido de la matriz, pero la reasignación de la matriz no:
void Foo(int[] data) { data[0] = 1; // caller sees this } void Bar(int[] data) { data = new int[20]; // but not this }
Si agrega el
ref
modificador, la referencia se pasa por referencia , y la persona que llama verá cualquiera de los cambios anteriores.fuente
Se pasan por valor (al igual que todos los parámetros que no son ni ref ni out), pero el valor es una referencia al objeto, por lo que efectivamente se pasan por referencia.
fuente
Sí, se pasan por referencia de forma predeterminada en C #. Todos los objetos en C # lo son, excepto los tipos de valor. Para ser un poco más precisos, se pasan "por referencia por valor"; es decir, el valor de la variable que ve en sus métodos es una referencia al objeto original pasado. Este es un pequeño punto semántico, pero a veces puede ser importante.
fuente