2009-04-13 16 views
25

vi dos enfoques comunes para las normas de codificación de variables miembro privadas:C# para las variables miembro privadas

class Foo 
{ 
    private int _i; 
    private string _id;  
} 

y

class Foo 
{ 
    private int m_i; 
    private string m_id; 
} 

Creo que este último viene de C++. Además, muchas personas especifican el tipo antes de la variable miembro (por ejemplo, double m_dVal) para indicar que se trata de una variable de miembro no constante del tipo double.

¿Cuáles son las convenciones en C#?

+0

@Andrew Hare NO duplicado exacto ya que estoy pidiendo un caso general y no solo m_. thx para señalar el enlace ... –

+3

Ese "truco" se cerró como S & A. Esta pregunta es válida (y la respuesta de Driis fue muy útil, podría agregar). –

Respuesta

10

yo prefiero usar el primer ejemplo, o auto-propiedades como esta, que evitar tener los campos privados previstos en su clase en todo:

public String MyString { get; set; } 

Utilice el fragmento prop para que éstos realmente rápido.

+2

Funciona excepto que no puedes hacer que las propiedades automáticas sean de solo lectura ... ah bueno, tal vez lo busque en C# 5.0. –

+9

Puede hacer que sean "de solo lectura" haciendo que el conjunto sea privado o esté protegido: public String MyString {get; conjunto privado; } –

+1

+1 No sabía sobre ese fragmento, ¡gracias! – wsanville

55

Además de los dos que menciona, es muy común en C# no tener un prefijo para miembros privados.

class Foo 
{ 
    private int i; 
    private string id; 
} 

Eso es lo que uso, y también lo que se recomienda en Microsoft's internal naming guidelines.

+10

De acuerdo, con la única excepción de que personalmente voy a anteponer un _ carácter cuando el miembro privado es la tienda de respaldo de una propiedad pública. –

+22

Prefiero el guión bajo porque me gusta conocer el alcance de la variable simplemente mirando el nombre –

+1

También uso siempre un prefijo de subrayado para los campos de respaldo de propiedades, ya que es fácil cometer un error y obtener un ... stackoverflow hur;) – meandmycode

7

Como recuerdo por leer Framework Design Guidelines, realmente no existe una convención establecida para las variables de miembros privados, excepto que no se debe usar la notación húngara y no se debe escribir en mayúscula la primera letra del nombre de la variable (usar Camel-casing). Hay citas en el libro que admiten ambos ejemplos, así como no usar ningún prefijo en absoluto.

Personalmente, prefiero el prefijo "m_".

13

Como se ha señalado por Brad Abrams: internal coding guidelines:

No usar un prefijo para el miembro variables (_, m_, s_, etc.). Si desea distinguir entre las variables de miembro locales y , debe usar "this." en C# y "Me." en VB.NET.

+2

¡Qué estúpida (realmente, realmente!) Directriz cuando se aplica a VB: VB no distingue el caso de los identificadores, por lo que esta guía simplemente * lo hace no funciona * (no puede distinguir entre propiedades y campos de respaldo)! Increíble. Bueno, todavía se puede aplicar a C#. Lo suficientemente justo. –

+21

@Konrad Radolph: Parece que tienen una guía implícita * interna *: no use VB :) –

+1

Imagino que deben hacerlo. Desearía tener un enlace, pero leí una recomendación de que el caso no se use como el único factor distintivo en C# para mantener la compatibilidad de interopt. –

1

Tiendo a ir con la primera convención, un guión bajo simple. Tampoco especifico el tipo en el nombre, porque tengo Intellisense diciéndome de qué se trata (lo sé, puede ser una muleta).

Lo mejor es consultar con sus compañeros de trabajo o compañeros de proyecto y simplemente decidir sobre una convención, algunos de ellos son un tanto arbitrarios.

1

Prefiero no usar ningún prefijo para las variables miembro. Para aquellos declarados fuera del método, uso "this.memberVariableName" para distinguirlos de aquellos declarados dentro del método.

orientación
6

general de Microsoft aquí:

http://msdn.microsoft.com/en-us/library/ms229002.aspx

propiedades automáticas en C# son grandes y usan luego en cuanto pueda, pero hay casos en los que no trabajan para mí, como cuando se hace tipo o comprobación del valor en un método establecido.

En general: utilice la carcasa de camello y no escriba ningún nombre como subrayado o prefijo de tipo.

public int Age {get; set;} 

o

private int age; 
public int Age 
{ 
    get { return age; } 
    set 
    { 
     if(value < 0) 
      throw new InvalidOperationException("Age > 0"); 
     age = value; 
    } 
} 
+2

No es partidario de arrojar excepciones es getter/setters propiedad. Pero esa es una lata de gusanos diferente :) –

+0

Estoy de acuerdo y no es algo que incluso infrecuentemente haga. Más para ilustrar. De acuerdo, una lata diferente de gusanos. – andleer

7

creo que el principio importante aquí es que eres consistente. Utilice un prefijo "_" o "m" si eso es lo que le gusta hacer y es coherente con el resto del código con el que está trabajando. Lo que sea que elija, quédese con él y sea consecuente.

+4

amén. La consistencia será el único estándar requerido. – gbjbaanb

3

Lo mejor es utilizar lo que ya se utiliza en el proyecto. Si comienza un nuevo proyecto, use lo que más se usa en la empresa.

+10

Si comienza una nueva compañía, arroje una moneda. :) – ibz

0

En C++ los identificadores que comienzan con _ se consideran malas prácticas, deben dejarse para uso interno. Creo que es por eso que prefijar un nombre de variable con _ a veces también se considera una mala práctica en C# ... aunque no hay ninguna razón por la que no puedas hacerlo ya que todas las internas de .NET están encapsuladas correctamente, a diferencia del C/C++ bibliotecas estándar

+0

En C++ me gusta _ como un sufijo para variables miembro (evitando así el problema de uso interno) – User

+0

Sí, eso está prohibido por los estándares. Uso 'm' sin guiones bajos, a pesar de la sabiduría convencional (es más fácil de leer una vez que superas tu sesgo de percepción y una cosa menos para confundir a los novatos). – jheriko

3

Prefiero subrayar como prefijo para los campos no const no privados. ¿Por qué? Razones: 1. Simplemente mirando la variable puedo distinguir entre el campo & variable local/parámetro. Usando esto." para todos los campos no es una opción, es más larga. 2. No hay ambigüedad entre el parámetro y el campo:

class Foo 
{ 
    private int id; 
    public Foo(int id) 
    { 
    id = id; //Will compile and work fine. But field will not be initialized. 
    } 
} 
+0

Sin embargo, este escenario específico generará una advertencia. –

4

Yo personalmente siempre han utilizado el primer ejemplo de:

public class Foo 
    { 
     private int _i; 
     private string _id; 
    } 

De hecho, eso es lo que usa todo mi equipo. Además, el que mencionó m_dVal se conoce como notación húngara, aquí está el Wikipedia Entry. La notación húngara está en realidad en contra de los estándares de codificación de nuestros equipos, por lo que nunca la uso.

Cuestiones relacionadas