¿Qué es la convención de nomenclatura de campos estáticos de C#?


Recientemente he comenzado a usar ReSharper, que es una herramienta fantástica. Hoy me encontré con una regla de nomenclatura para los campos estáticos, es decir, prefijar con un subrayado ie.

private static string _myString;
  1. ¿Es realmente esta la forma estándar de nombrar variables estáticas? Si es así, ¿es solo preferencia personal y estilo, o tiene algún tipo de impacto de menor nivel? Por ejemplo, Compilación JIT etc?
  2. ¿De dónde se origina este estilo? Siempre lo he asociado con C++, es que ¿correcto?
Author: Matt, 2010-06-18

9 answers

Las directrices de Microsoft no se refieren a los campos privados, solo se refieren a los miembros visibles públicamente.

Las convenciones comunes son camelCase, _camelCase e incluso a veces la resaca de C++/MFC m_camelCase.

Si usa camelCase sin un prefijo, los campos de respaldo de su propiedad solo diferirán del nombre de la propiedad en case, lo cual no es un problema en C#, pero no funcionará en un lenguaje que no distingue entre mayúsculas y minúsculas como VB.NET.

Tanta gente, incluyéndome a mí, le gusta usar un prefijo de subrayado para que los mismos estándares se puedan usar en todos los idiomas. En mi experiencia, el subrayado es mucho más común que m_.

 22
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-18 16:29:44

De acuerdo con MSDN, use Pascal Case para campos estáticos. Siempre me río cuando MSDN y StyleCop se contradicen :).

Así que si está siguiendo los estándares MSDN, la forma correcta es:

private static string MyString;
 18
Author: dcp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-18 16:35:47

En realidad es el estilo para un campo privado, estático o no. (Al menos en ReSharper)

 11
Author: Aren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-18 16:22:55

De acuerdo con StyleCop (y con la configuración predeterminada), la forma correcta de nombrar la mayoría de los campos (como se especifica a continuación) es con una letra minúscula al principio.

SA1306: FieldNamesMustBeginWithLowerCaseletter

... Los nombres de campo y variable deben comenzar con una letra minúscula, a menos que el campo sea público o interno, const o no privado y solo de lectura. En estos casos, el campo debe comenzar con una letra mayúscula.

Véase también SA1309: Los nombres de campo no deben comenzar con Underscore .

 11
Author: Mark Rushakoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-17 19:22:33

El problema que tengo con la directriz MSDN (use el caso Pascal) es que no hay distinción entre una variable estática privada y una propiedad pública (no estática). El mismo problema se plantearía para las propiedades estáticas, sin distinción entre estáticas y no estáticas.

¿Quizás esto es deliberado?

Una forma de salir de esto sería usar el mismo estándar para estática que para no estática, pero siempre calificar el uso de estática prefijando el nombre de la clase. Se puede haber algunos caracteres adicionales para escribir, pero hace que el código sea más legible. Por ejemplo:

public class Employee
{
    private static Int32 thresholdPercentage = 5;
    public static String TooMuchMessage = "Unacceptable pay rise - sorry!";

    private Decimal _salary = 0.0m;

    public void RaiseSalary(Int32 raiseAmountPercentage)  
    {
        if (raiseAmountPercentage > Employee.thresholdPercentage)
            throw new ApplicationException(Employee.TooMuchMessage);

        _salary *= 1 + (raiseAmountPercentage / 100);

        return;
    }
}
 3
Author: Adrian Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-22 14:32:17

La convención es lo que los estándares de codificación de su empresa dicen que es.

 3
Author: Muad'Dib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-14 08:40:01

1 - No existe una regla estándar definitiva para los nombres de variables. Hay requisitos del compilador de C# para lo que está permitido y lo que no está permitido (es decir, no puede comenzar con un número), pero las reglas de estilo del lenguaje de programación generalmente se dejan en manos de los programadores / organizaciones. ReSharper tiene reglas de estilo predefinidas; sin embargo, simplemente se configuran como predeterminados en un enfoque de convención sobre configuración y son modificables.

2-Puedes echar un vistazo a este artículo de wikipedia para ver el historia detrás de Camel Casing.

 0
Author: JD Courtoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-18 16:28:11

Para los campos estáticos, me he establecido en StaticUpperCamelCase (eg. StaticPersonCache), ya que claramente lo distingue de una variable de instancia. Esto incluye campos estáticos privados así como campos estáticos con otros modificadores de visibilidad.

Para las variables estáticas, me preocupa menos indicar la visibilidad pública/privada a través del nombre que indicar cómo opera la variable entre las instancias. Además, ya que no hay (y realmente no debería haber) muchos estáticos variables el modificador' Hugarian-like ' no se aplica a menudo.

De manera similar, para las variables thread static ([ThreadStatic] o ThreadLocal) la convención que uso es TS_UpperCamelCase (eg. TS_Random). Una vez más, esta "ruptura" de las normas transmite información muy importante que otros desarrolladores podrían no ver a primera vista. Por lo tanto, el nombre se usa como una especie de bandera de precaución.

Uso ReSharper y he ajustado las advertencias/sugerencias en consecuencia; la mayoría de las otras convenciones de nomenclatura se dejan en la configuración predeterminada de ReSharper.

Mi selección de tales convenciones "no estándar" para static/thread-static fields (nota: Microsoft usa TS_ en algún código en la biblioteca.NET) se debe a que me he encontrado con más de una 'peculiaridad' debido a la identificación errónea de variables estáticas/Threadstáticas/de instancia: eso es mucho más difícil de hacer con StaticX, TS_X, _x.

 0
Author: user2864740,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-02 06:50:31

Otras respuestas aquí son un poco confusas.

De estándar. NET :

Utilice PascalCasing en los nombres de campo.
Las directrices de nomenclatura de campos se aplican a los campos estáticos públicos y protegidos.

Así que el ejemplo será: MyStaticVariable, ActiveUserCount, etc.

 0
Author: Manohar Reddy Poreddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-09 03:26:37