Orden de los elementos en las clases: Campos, Propiedades, Constructores, Métodos


¿Existe una directriz oficial de C# para el orden de los elementos en términos de estructura de clases?

Va:

  • Campos públicos
  • Campos privados
  • Propiedades
  • Constructores
  • Métodos
    ?

Tengo curiosidad si hay una regla dura y rápida sobre el orden de los artículos? Estoy por todas partes. Quiero seguir con un estándar en particular para poder hacerlo en todas partes.

El verdadero problema es que mis propiedades más complejas terminan se parecen mucho a los métodos y se sienten fuera de lugar en la parte superior antes que el constructor.

¿Algún consejo/sugerencia?

Author: Stephen Kennedy, 2008-09-30

15 answers

De acuerdo con la Documentación de Reglas de StyleCop el orden es el siguiente.

Dentro de una clase, estructura o interfaz: (SA1201 y SA1203)

  • Campos constantes
  • Campos
  • Constructores
  • Finalizadores (Destructores)
  • Delegados
  • Eventos
  • Enums
  • Interfaces
  • Propiedades
  • Indexadores
  • Métodos
  • Estructuras
  • Clases

Dentro de cada uno de estos grupos ordenar por acceso: (SA1202)

  • público
  • interno
  • interno protegido
  • protegido
  • privado

Dentro de cada uno de los grupos de acceso, ordenar por estático, luego no estático: (SA1204)

  • estática
  • no estático

Dentro de cada uno de los grupos de campos estáticos/no estáticos, ordene por readonly, luego non-readonly: (SA1214 y SA1215)

  • readonly
  • no sólo leído

Una lista desenrollada tiene 130 líneas no lo desenrollará aquí. La parte de métodos desenrollada es:

  • métodos estáticos públicos
  • métodos públicos
  • métodos estáticos internos
  • métodos internos
  • métodos estáticos internos protegidos
  • métodos internos protegidos
  • métodos estáticos protegidos
  • métodos protegidos
  • métodos estáticos privados
  • métodos privados

La documentación señala que si el orden prescrito no es adecuado, por ejemplo, varias interfaces son se está implementando, y los métodos y propiedades de la interfaz deben agruparse juntos - luego use una clase parcial para agrupar los métodos y propiedades relacionados.

 701
Author: Jonathan Wright,
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-05-19 10:09:18

En lugar de agrupar por visibilidad o por tipo de elemento (campo, propiedad, método, etc.), ¿qué tal agrupar por funcionalidad?

 30
Author: Ryan Lundy,
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
2008-09-29 20:30:43

Recomendaría usar los estándares de codificación de iDesigno los enumerados en El sitio web de Brad Abram. Esos son los dos mejores que he encontrado.

Brad diría...

Los miembros de las clases deben estar alfabetizados y agrupados en secciones (Campos, Constructores, Propiedades, Eventos, Métodos, implementaciones de interfaces privadas, tipos anidados)

 13
Author: Elijah Manor,
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
2008-09-29 20:30:20

Esta es una pregunta antigua pero todavía muy relevante, así que agregaré esto: ¿Qué es lo primero que busca cuando abre un archivo de clase que puede o no haber leído antes? ¿Fields? Propiedades? Me he dado cuenta por experiencia que casi invariablemente voy a la caza de los constructores, porque lo más básico para entender es cómo se construye este objeto.

Por lo tanto, he comenzado a poner a los constructores en primer lugar en los archivos de clase, y el resultado ha sido psicológicamente muy positivo. La recomendación estándar de poner constructores después de un montón de otras cosas se siente disonante.

La próxima característica del constructor primario en C# 6 proporciona evidencia de que el lugar natural para un constructor está en la parte superior de una clase; de hecho, los constructores primarios se especifican incluso antes de la llave abierta.

Es curioso cuánta diferencia hace un reordenamiento como este. Me recuerda cómo se ordenaban las sentencias using - con los espacios de nombres del sistema primero. El comando "Organizar usos" de Visual Studio usó este orden. Ahora los using se ordenan alfabéticamente, sin dar un tratamiento especial a los espacios de nombres del Sistema. El resultado se siente más simple y limpio.

 13
Author: bright,
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
2015-01-17 10:55:20

No conozco un idioma o un estándar de la industria, pero tiendo a poner las cosas en este orden con cada sección envuelta en una # región:

Usando instrucciones

Espacio de nombres

Clase

Miembros privados

Propiedades públicas

Constructores

Métodos públicos

Métodos privados

 10
Author: Wayne,
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
2008-09-29 20:30:02

Como se mencionó anteriormente, no hay nada en el lenguaje C# que dicte el diseño, yo personalmente uso regiones, y hago algo como esto para una clase promedio.

public class myClass
{
#region Private Members

#endregion
#region Public Properties

#endregion

#region Constructors

#endregion
#region Public Methods

#endregion
}

Tiene sentido para mí de todos modos

 4
Author: Mitchel Sellers,
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
2008-09-29 20:31:18

Desde StyleCop

Campos privados, campos públicos, constructores, propiedades, métodos públicos, métodos privados

Como StyleCop es parte del proceso de compilación de MS, podría verlo como un estándar de facto

 3
Author: blowdart,
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
2008-09-29 20:30:53

Normalmente trato de seguir el siguiente patrón:

  • miembros estáticos (normalmente tienen otro contexto, deben ser seguros para subprocesos, etc.)
  • miembros de instancia

Cada parte (estática e instancia) consta de los siguientes tipos de miembros:

  • operadores (son siempre estáticos)
  • campos (inicializados antes de los constructores)
  • constructores
  • destructor ( es una tradición para seguir la constructores )
  • propiedades
  • métodos
  • eventos

Luego los miembros se ordenan por visibilidad (de menos a más visible):

  • privado
  • interno
  • interno protegido
  • protegido
  • público

El orden no es un dogma: las clases simples son más fáciles de leer, sin embargo, las clases más complejas necesitan una agrupación específica del contexto.

 3
Author: Michael Damatov,
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
2008-09-29 21:12:48

Lo más cercano que es probable que encuentre es "Pautas de diseño, código administrado y. NET Framework" ( http://blogs.msdn.com/brada/articles/361363.aspx [2]}) por Brad Abrams

Muchas normas se describen aquí. La sección relevante es 2.8 creo.

 2
Author: Rory Becker,
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
2008-09-29 20:29:33

Mi preferencia es ordenar por tipo y luego disminuir la visibilidad de la siguiente manera

public methods
public events
public properties

protected methods
protected events
protected properties

private methods
private events
private properties
private fields

public delegates
public interfaces
public classes
public structs

protected delegates
protected interfaces
protected classes
protected structs

private delegates
private interfaces
private classes
private structs

Sé que esto viola Style Cop y si alguien puede darme una buena razón por la que debería colocar los detalles de implementación de un tipo antes de su interfaz, estoy dispuesto a cambiar. En la actualidad, tengo una fuerte preferencia por poner a los miembros privados en último lugar.

Nota: No uso campos públicos o protegidos.

 2
Author: Aluan Haddad,
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-12-18 14:00:03

Las únicas pautas de codificación que he visto sugeridas para esto es poner los campos en la parte superior de la definición de la clase.

Tiendo a poner a los constructores a continuación.

Mi comentario general sería que debería atenerse a una clase por archivo y si la clase es lo suficientemente grande como para que la organización de propiedades versus métodos sea una gran preocupación, ¿qué tan grande es la clase y debería refactorizarla de todos modos? ¿representa múltiples preocupaciones?

 1
Author: Hamish Smith,
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
2008-09-29 20:29:28

Prefiero poner los campos privados en la parte superior junto con el constructor(s), luego poner los bits de la interfaz pública después de eso, luego los bits de la interfaz privada.

Además, si la definición de su clase es lo suficientemente larga como para que el orden de los elementos importe mucho, eso es probablemente un olor a código que indica que su clase es demasiado voluminosa y compleja y debe refactorizar.

 1
Author: Wedge,
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-05-23 11:54:58

Lo mantengo lo más simple posible (al menos para mí)

Enumeraciones
Declaraciones
Constructores
Overrides
Métodos
Propiedades
Controlador de eventos

 1
Author: Pat,
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
2008-09-29 20:42:22

Ciertamente no hay nada en el lenguaje que lo haga cumplir de ninguna manera. Tiendo a agrupar cosas por visibilidad (público, luego protegido, luego privado) y uso #regiones para agrupar cosas relacionadas funcionalmente, independientemente de si es una propiedad, método o lo que sea. Los métodos de construcción (ya sean ctor reales o funciones de fábrica estáticas) suelen estar en la parte superior, ya que son lo primero que los clientes necesitan saber.

 0
Author: Jeff Kotula,
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
2008-09-29 20:26:38

Sé que esto es viejo pero mi orden es la siguiente:

En orden de público, protegido, privado, interno, abstracto

  • Constantes
  • Variables estáticas
  • Campos
  • Eventos
  • Constructor(es)
  • Métodos
  • Propiedades
  • Delegados

También me gusta escribir propiedades como esta (en lugar del enfoque abreviado)

// Some where in the fields section
private int someVariable;

// I also refrain from
// declaring variables outside of the constructor

// and some where in the properties section I do
public int SomeVariable
{
    get { return someVariable; }
    set { someVariable = value; }
}
 0
Author: ,
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-12-07 07:08:16