property - static vs const c#




Estático readonly vs const (10)

He leído acerca de static readonly campos const y static readonly . Tenemos algunas clases que solo contienen valores constantes. Se utiliza para varias cosas alrededor de nuestro sistema. Así que me pregunto si mi observación es correcta:

¿Deben este tipo de valores constantes ser siempre static readonly para todo lo que es público? ¿Y solo usa const para valores internos / protegidos / privados?

¿Que recomiendas? ¿Es posible que incluso no use static readonly campos static readonly , sino que use las propiedades tal vez?


Const: Const no es más que "constante", una variable cuyo valor es constante pero en tiempo de compilación. Y es obligatorio asignarle un valor. Por defecto, const es estático y no podemos cambiar el valor de una variable const en todo el programa.

Static ReadOnly: el valor de una variable de tipo Static Readonly puede asignarse en tiempo de ejecución o asignarse en tiempo de compilación y cambiarse en tiempo de ejecución. Pero el valor de esta variable solo se puede cambiar en el constructor estático. Y no se puede cambiar más. Puede cambiar solo una vez en tiempo de ejecución

Referencia: c-sharpcorner


Algunas otras cosas

const int a

  • debe ser inicializado
  • La inicialización debe ser en tiempo de compilación

readonly int a

  • Se puede usar el valor por defecto, sin inicializar.
  • La inicialización puede ser en tiempo de ejecución

Hay una diferencia menor entre los campos const y read readly static en C # .Net

const debe inicializarse con valor en tiempo de compilación.

const es, por defecto, estático y debe inicializarse con un valor constante, que no se puede modificar más adelante. No se puede utilizar con todos los tipos de datos. Por ex DateTime. No se puede utilizar con el tipo de datos DateTime.

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public static readonly string Name = string.Empty; //No error, legal

readonly se puede declarar como estático, pero no es necesario. No es necesario inicializar en el momento de la declaración. Su valor puede ser asignado o cambiado usando el constructor una vez. Por lo tanto, existe la posibilidad de cambiar el valor del campo de solo lectura una vez (no importa, si es estático o no), lo que no es posible con const.


La palabra clave readonly es diferente de la palabra clave const . Un campo const solo se puede inicializar en la declaración del campo. Un campo de readonly puede inicializarse en la declaración o en un constructor. Por lo tanto, los campos de readonly pueden tener diferentes valores dependiendo del constructor utilizado. Además, mientras que un campo const es una constante de tiempo de compilación, el campo de readonly se puede usar para constantes de tiempo de ejecución

Breve y clara referencia de MSDN aquí.


Mi preferencia es usar const siempre que pueda, lo que, como se mencionó anteriormente, se limita a expresiones literales o algo que no requiere evaluación.

Si me caliento contra esa limitación, entonces retrocedo a la lectura estática solo , con una advertencia. Por lo general, usaría una propiedad estática pública con un captador y un campo de lectura estática privada de respaldo, como menciona Marc here .


Un campo de solo lectura estático es ventajoso cuando se expone a otros ensamblajes un valor que podría cambiar en una versión posterior.

Por ejemplo, supongamos que el conjunto X expone una constante de la siguiente manera:

public const decimal ProgramVersion = 2.3;

Si el ensamblaje Y referencia a X y utiliza esta constante, el valor 2.3 se incluirá en el ensamblaje Y cuando se compile. Esto significa que si X se vuelve a compilar con la constante establecida en 2.4, Y seguirá utilizando el valor anterior de 2.3 hasta que Y se vuelva a compilar. Un campo de solo lectura estático evita este problema.

Otra forma de ver esto es que cualquier valor que pueda cambiar en el futuro no es constante por definición y, por lo tanto, no debe representarse como uno solo.


Yo usaría static readonly si el Consumidor está en un ensamblaje diferente. Tener a la const y al consumidor en dos montajes diferentes es una buena forma de dispararte en el pie .


const

  1. el valor debe ser dado a la declaración
  2. constante de tiempo de compilación

solo lectura:

  1. el valor puede darse en la declaración o durante el tiempo de ejecución utilizando constructores. El valor puede variar dependiendo del constructor utilizado.
  2. constante de tiempo de ejecución

public static readonly campos de public static readonly son un poco inusuales; public static propiedades public static (con solo una get ) serían más comunes (quizás respaldadas por un campo de private static readonly ).

const valores const se graban directamente en el sitio de la llamada; esto es de doble filo:

  • es inútil si el valor se recupera en tiempo de ejecución, tal vez desde config
  • Si cambia el valor de una constante, debe reconstruir todos los clientes.
  • pero puede ser más rápido, ya que evita una llamada al método ...
  • ... que a veces podría haber sido incluido por el JIT de todos modos

Si el valor nunca cambia, entonces const es correcto - Zero etc., haga constantes razonables; p Aparte de eso, las propiedades static son más comunes.


Const : los valores de las variables const deben definirse junto con la declaración y después de eso no cambiarán. Las const son implícitamente estáticas, así que sin crear una instancia de clase podemos acceder a ellas. Esto tiene un valor en tiempo de compilación.

ReadOnly : valores de solo lectura que podemos definir al declarar y usar el constructor en tiempo de ejecución. Las variables de solo lectura no pueden acceder sin instancia de clase.

Lectura estática solo : valores de variable estática de solo lectura que podemos definir mientras declaramos y solo a través del constructor estático pero no con ningún otro constructor. A estas variables también podemos acceder sin crear una instancia de clase (como variables estáticas)

La lectura estática solo será una mejor opción si tenemos que consumir las variables en diferentes ensamblajes. Por favor, revise los detalles completos en el siguiente enlace

https://www.stum.de/2009/01/14/const-strings-a-very-convenient-way-to-shoot-yourself-in-the-foot/





constants