2010-03-07 9 views
21

para aclarar la pregunta, me gustaría agregar que no estoy preguntando por qué debería elegir readonly over const o cuáles son los beneficios de readsly over const.¿Por qué resharper sugiere usar readonly en campos que no se modifican?

Estoy preguntando por qué hacer un campo de solo lectura simplemente porque no ha cambiado (por el momento).

por ejemplo: si me gustaría escribir la siguiente clase:

public class MyClass 
{ 
     public int _i = 5; 

     // Code that doesn't change the value of i: 
     ... 
} 

ReSharper indicará que se puede hacer de sólo lectura.

Gracias

+4

Es un consejo equivocado, usted hizo el campo público. Si hubiera sugerido utilizar una propiedad, entonces le habría dado buenos consejos. –

Respuesta

29

Cuando detecta que no se está asignando a una variable, excepto en initilization, se presume que no desea que la variable para cambiar. Hacer que la variable sea de solo lectura (o const) evitará que se asigne a la variable en el futuro. Dado que esto parece (por uso) como el comportamiento que desea, sugiere que lo formalice y obtenga el beneficio de la protección.

+0

¿Alguien quiere comentar sobre el voto a favor? Siempre estoy ansioso por saber cuándo puedo estar equivocado. – tvanfosson

+0

Parece claro que Saulius nos votó a los dos. – Hogan

+1

@Hogan: Saulius no tiene ningún voto a favor en su página de perfil. Solo otro muppet teniendo un mal día, supongo. –

3

Resharper es una herramienta, no puede ver nada más que el código que se muestra. Si planea cambiar el código en el futuro, Resharper no tiene forma de saberlo, por lo que hace sugerencias basadas en su código actual.

3

Bueno, es bastante obvio, que una variable que nunca ha cambiado debe ser const o de solo lectura. La pregunta de cuál de estos es mejor depende de la situación. Las variables de Const son, por definición, constantes; sus valores deben ser NUNCA cambio (por ejemplo, const int minutesInAnHour = 60; parece un buen candidato). Es por eso que la constante es un miembro estático implícitamente y se inicializa durante el tiempo de compilación, es decir, el compilador realmente puede reemplazar todas las apariencias de su constante con el valor literal, aunque no estoy seguro de si algún compilador realmente lo hace.

Readonly, por otro lado, es una variable miembro cuyo valor no debe cambiar, una vez inicializado, lo que significa que no es realmente una constante, puede hacer algo en las líneas de readonly DateTime time = DateTime.Now;. Esto, por supuesto, no será un miembro estático, de hecho será un miembro normal solo con la restricción de que no se puede cambiar una vez asignado. El beneficio de esto frente a const es que si su variable const cambia en alguna compilación, es posible que otras bibliotecas de dependad no lo sepan, incluso pueden tener el valor constante compilado, tendrá que reconstruir todo.

Y en cuanto a la pregunta de por qué resharper sugiere readonly vs. const - No estoy seguro, supongo que una variable de solo lectura es menos restrictiva y supone que eso es lo que el desarrollador probablemente quería.

+0

Con respecto a la read-only-ness, hay dos tipos de campos de tipo reference: aquellos que se puede suponer que siempre apuntan al mismo objeto, y aquellos que se pueden hacer con seguridad para apuntar a diferentes objetos si surge la necesidad . Los campos del primer tipo deben ser 'readonly', si los objetos a los que se refieren son mutables o inmutables; los campos del segundo tipo no deben ser 'readonly', incluso si la clase actualmente no tiene motivos para cambiarlos después de la construcción. Por ejemplo, si la primera versión de una clase similar a 'List ' requiere que el tamaño se especifique en su constructor ... – supercat

+0

... podría crear una matriz dentro de su constructor y usar esa misma matriz para siempre. Si ningún código se basa en que continúe con esa misma matriz, una versión futura de la clase podría ofrecer un método 'Resize' que crea una nueva matriz, copia elementos de la antigua a la nueva y abandona la antigua. Sin embargo, si algún código en cualquier lugar se basa en la clase siempre utilizando la misma matriz, dicho método no funcionaría. La decisión de declarar o no el conjunto 'readonly' determinaría qué camino de expansión futura se permitiría. – supercat

3

Resharper indicará que se puede hacer de solo lectura.

Para agregar a otras respuestas, tenga en cuenta que puede cambiar la gravedad de esta inspección en ReSharper | Options | Code Inspection | Inspection Severity | Field can be made readonly. Lo tengo como 'Mostrar como sugerencia'; puede pedirle a ReSharper que ignore por completo esta inspección, si lo desea.

5

Normalmente trato de recordar para hacer lo que Resharper está tratando de recordarle que debe hacer. Si tengo campos que son inmutables, me gusta marcarlos con readonly para formalizar eso. En muchos tipos, hago esto todos los campos.Hay benefits of immutability ([2][3]), y Resharper está tratando de ayudarlo a aprovecharlas.

Yo personalmente no uso Resharper. Tengo mis razones.

+1

Ayúdame a comprender: intentas recordar hacer lo que ReSharper intenta recordarte, pero no usas ReSharper personalmente. Estas dos declaraciones se contradicen entre sí. –

+3

Leí su declaración como "Estoy de acuerdo con las reglas que R # te da y trato de seguirlas yo mismo, aunque yo no uso R # yo mismo (más)". –

+1

@ John Saunders: El "tú" en mi declaración fue literal, refiriéndose al OP, no un sustituto del pronombre "uno". Si Resharper me estuviera recordando ** algo **, entonces no tendría exactamente que intentar recordarlo yo mismo. –

Cuestiones relacionadas