2010-08-03 12 views
21

Estoy trabajando en un proyecto usando ReSharper. En ocasiones, me indica que un campo puede hacerse solo. ¿Hay algún rendimiento u otro beneficio en esto? Supongo que los beneficios serían bastante bajos, ¿o los beneficios serían puramente semánticos?¿Hay algún beneficio en hacer que un campo C# sea de solo lectura si es apropiado?

Gracias

con el ejemplo debajo del campo fue inicialmente solo privado, pero ReSharper llevaron a establecerlo como de sólo lectura. Entiendo la razón por la cual se puede establecer como de solo lectura, es decir. Su ser fijado en el constructor y no ha cambiado de nuevo, pero preguntando si hay algún beneficio a esto ...

public class MarketsController : Controller 
{ 
    private readonly IMarketsRepository marketsRepository; 

    public AnalysisController(IMarketsRepository marketsRepository) 
    {     
     this.marketsRepository = marketsRepository; 
    } 
} 

Editar ¿Cuál es la forma más fácil de ver el MSIL?

+0

por favor explique con el código. podría ser fácil responder – anishMarokey

Respuesta

23

El beneficio es puramente semántico. Ayudará a los usuarios de su código a comprender explícitamente que este campo no se puede cambiar después de crear el objeto. El compilador evitará cambios no deseados de este campo. Estoy totalmente de acuerdo con la siguiente cita de Python Zen:

Explicit es mejor que implicit.

Algunos detalles:

La única diferencia entre el campo normal y campo de sólo lectura es bandera initonly en IL. No hay optimización al respecto (como con las constantes) porque en realidad permite todas las operaciones (get y set, pero solo en ctor). Es solo una pista para el compilador: no permita que se modifique después de la construcción.

.field public initonly int32 R 
+5

+1: ser explícito con respecto a los campos de solo lectura ayuda de forma masiva al razonar sobre sistemas multiproceso. Cuando agrega un campo de instancia a cualquier clase, debe pensar si debería cambiar o no. Si no lo hace, márcalo como si fuera solo, tan simple como eso. De hecho, a veces pienso que debería haber una palabra clave 'mutable' en lugar de 'readonly' (guiño a F # y sus idiomas principales). –

2

Usted puede estar interesado en this answer.

La palabra clave de sólo lectura se utiliza para declara una variable miembro de una constante, pero permite que el valor de calcularse en tiempo de ejecución. Esto difiere de una constante declarada con el modificador const , que debe tener su valor establecido en tiempo de compilación. Con readonly puede establecer el valor del campo en la declaración o en el constructor del objeto que pertenece al campo .

8

No es tanto un rendimiento de bajo nivel, sino más mantenimiento de alto nivel. Hacer las cosas solo es una de las posibilidades que tiene para limitar y controlar el número de lugares donde se puede cambiar un cierto valor. Esto, a su vez, significa que se reduce la interdependencia entre clases (a.k.a., "acoplamiento libre"); el resultado es una aplicación que tiene menos dependencias internas y, por lo tanto, una complejidad menor. En otras palabras, los campos y propiedades de solo lectura hacen que su aplicación sea más fácil de mantener.

2

También podría ayudar a detectar algunos errores también. El valor se asigna solo en un construcotor y esto podría ser un problema si olvidó cambiar en otro lugar o no. Y si no se supone que debe cambiarse, entonces márcalo como de solo lectura.

3

Mi profesor me enseñó el día en que declarar algo de forma sencilla es una manera de admitir en su computadora que comete errores.

+0

La depuración es admitir que cometió un error. –

+1

"Alguna vez lo has intentado. Alguna vez fallaste. No importa. Inténtalo de nuevo. Fracasa nuevamente. Fracasa mejor", así es como aprendemos y nada de lo que avergonzarnos. En ese contexto especial de "solo lectura" iría con Alex Humphrey: no es un error, es un avance. – mbx

Cuestiones relacionadas