Kolejność elementów w klasach: pola, właściwości, konstruktory, metody

Czy istnieją oficjalne wytyczne C# dotyczące kolejności elementów w kategoriach struktury klas?

Does it go:

  • Pola Publiczne
  • Pola Prywatne
  • Właściwości
  • konstruktorzy
  • Metody
    ?

Jestem ciekaw, czy istnieje mocna i szybka zasada dotycząca kolejności przedmiotów? Jestem wszędzie. Chcę trzymać się określonego standardu, więc mogę to robić wszędzie.

Prawdziwym problemem jest to, że moje bardziej złożone właściwości kończą się wyglądają jak metody i czują się nie na miejscu przed konstruktorem.

Jakieś wskazówki/sugestie?

Author: Stephen Kennedy, 2008-09-30

15 answers

Zgodnie z dokumentacją StyleCop Rules kolejność jest następująca.

Wewnątrz klasy, struktury lub interfejsu: (SA1201 i SA1203)

  • Stałe Pola
  • pola
  • konstruktorzy
  • Finalizery (Destruktory)
  • delegaci
  • wydarzenia
  • Enums
  • Interfejsy
  • właściwości
  • indeksy
  • metody
  • Structs
  • klasy

W każdej z tych grup Uporządkuj według dostępu: (SA1202)

  • public
  • wewnętrzny
  • protected internal
  • protected
  • private

W każdej z grup dostępu Uporządkuj statycznie, a następnie niestatycznie: (SA1204)

  • static
  • non-static

W każdej ze statycznych / niestatycznych grup pól, kolejność według readonly, a następnie non-readonly: (SA1214 i SA1215)

  • readonly
  • non-readonly

Lista rozwijana ma długość 130 linijek, więc nie rozwinie tego tutaj. Część metody jest rozwinięta:

  • publiczne metody statyczne
  • metody publiczne
  • wewnętrzne metody statyczne
  • metody wewnętrzne
  • protected internal static methods
  • protected internal methods
  • protected static methods
  • metody chronione
  • prywatne metody statyczne
  • metody prywatne

Dokumentacja zauważa, że jeśli przepisana kolejność nie jest odpowiednia-powiedzmy, wiele interfejsów jest zaimplementowane, a metody interfejsu i właściwości powinny być pogrupowane razem - następnie użyj klasy częściowej, aby zgrupować powiązane metody i właściwości razem.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 10:09:18

Zamiast grupować po widoczności lub po typie elementu (pole, właściwość, metoda itp.), a może Grupowanie według funkcjonalności?

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:30:43

Polecam korzystanie ze standardów kodowania z IDesign lub tych wymienionych na stronie Brada Abrama . To najlepsze dwa, jakie znalazłem.

Brad by powiedział...

Klasy powinny być Alfabetycznie ułożone i pogrupowane w sekcje (pola, konstruktory, właściwości, zdarzenia, metody, implementacje prywatnych interfejsów, typy zagnieżdżone)

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:30:20

Jest to stare, ale wciąż bardzo istotne pytanie, więc dodam: co jest pierwszą rzeczą, której szukasz, gdy otwierasz plik klasy, który być może wcześniej przeczytałeś lub nie? Pola? Nieruchomości? Z doświadczenia zdałem sobie sprawę, że prawie zawsze poluję na konstruktorów, ponieważ najbardziej podstawową rzeczą do zrozumienia jest to, jak ten obiekt jest zbudowany.

Dlatego zacząłem stawiać konstruktory na pierwszym miejscu w klasowych plikach, a wynik był psychologicznie bardzo tak. Standardowe zalecenie stawiania konstruktorów za kilkoma innymi rzeczami wydaje się dysonansowe.

Nadchodząca funkcja głównego konstruktora w C# 6 dostarcza dowodów na to, że naturalne miejsce dla konstruktora jest na samym szczycie klasy - w rzeczywistości podstawowe konstruktory są określone nawet przed nawiasami otwartymi.

To zabawne, jak duża jest różnica w takim uporządkowaniu. Przypomina mi to jak using polecenia były porządkowane-z systemowymi przestrzeniami nazw najpierw. Polecenie Visual Studio "Organize Usings" wykorzystało ten rozkaz. Teraz using S są po prostu uporządkowane alfabetycznie, bez specjalnego traktowania systemowych przestrzeni nazw. Wynik po prostu wydaje się prostszy i czystszy.
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-17 10:55:20

Nie znam się na języku czy standardzie branżowym, ale zazwyczaj układam rzeczy w tej kolejności z każdą sekcją zawiniętą w # region:

Using Statements

Przestrzeń nazw

Klasa

Członkowie prywatni

Public properties

Konstruktory

Metody publiczne

Metody prywatne

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:30:02

Jak już wcześniej wspomniałem, w języku C# nie ma nic, co dyktowałoby układ, ja osobiście używam regionów i robię coś takiego dla klasy średniej.

public class myClass
{
#region Private Members

#endregion
#region Public Properties

#endregion

#region Constructors

#endregion
#region Public Methods

#endregion
}

It makes sense to me anyway

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:31:18

From StyleCop

Private fields, public fields, constructors, properties, public methods, private methods

Jako, że StyleCop jest częścią procesu MS build, możesz to zobaczyć jako de facto standard

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:30:53

Zazwyczaj staram się podążać za następnym wzorcem:

  • statyczne elementy (mają zwykle inny kontekst, muszą być bezpieczne dla wątku itp.)
  • Członkowie instancji

Każda część (statyczna i instancyjna) składa się z następujących typów elementów:

  • operatory (są zawsze statyczne)
  • pola (inicjowane przed konstruktorami)
  • konstruktorzy
  • destructor (to tradycja podążania za konstruktorzy )
  • właściwości
  • metody
  • Wydarzenia

Następnie członkowie są sortowane według widoczności (od mniej do bardziej widocznych):

  • private
  • Wewnętrzny
  • wewnętrzna ochrona
  • protected
  • public

Kolejność nie jest dogmatem: proste klasy są łatwiejsze do odczytania, jednak bardziej złożone klasy wymagają grupowania kontekstowego.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 21:12:48

Najbliżej znajdziesz " wytyczne projektowe, zarządzany kod i. NET Framework "( http://blogs.msdn.com/brada/articles/361363.aspx ) by Brad Abrams

Przedstawiono tu wiele standardów. Odpowiednia sekcja to chyba 2.8.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:29:33

Moje preferencje to uporządkowanie według rodzaju, a następnie zmniejszenie widoczności w następujący sposób

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

Wiem, że to narusza styl Cop i jeśli ktoś może mi podać dobry powód, dla którego powinienem umieścić szczegóły implementacji typu przed jego interfejsem, to jestem skłonny zmienić. Obecnie zdecydowanie preferuję umieszczanie prywatnych członków na ostatnim miejscu.

Uwaga: nie używam pól publicznych ani chronionych.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-18 14:00:03

Jedyne wytyczne kodowania, które widziałem sugerowane dla tego jest umieszczenie pól na górze definicji klasy.

Mam tendencję do stawiania konstruktorów obok.

Mój ogólny komentarz byłby taki, że powinieneś trzymać się jednej klasy na plik i jeśli klasa jest na tyle duża, że organizacja właściwości kontra metody jest dużym problemem, jak duża jest klasa i czy i tak powinieneś ją refaktoryzować? czy reprezentuje wiele obaw?

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:29:28

Wolę umieścić prywatne pola na górze wraz z konstruktorem (konstruktorami), następnie umieścić publiczne bity interfejsu, a następnie prywatne bity interfejsu.

Ponadto, jeśli twoja definicja klasy jest wystarczająco długa, aby kolejność przedmiotów miała duże znaczenie, prawdopodobnie jest to zapach kodu wskazujący, że twoja klasa jest zbyt nieporęczna i złożona i powinieneś refaktorować.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:58

I keep it as simple as possible (for me at least)

Wyliczenia
Deklaracje
Konstruktorzy
Overrides
Metody
Właściwości
Event Handler

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:42:22

Z pewnością nie ma w języku nic, co by go w jakikolwiek sposób wymusiło. Mam tendencję do grupowania rzeczy według widoczności (publicznej, potem chronionej, potem prywatnej) i używam #regions do grupowania powiązanych rzeczy funkcjonalnie, niezależnie od tego, czy jest to właściwość, metoda, czy cokolwiek innego. Metody konstrukcyjne (czy rzeczywiste ctor lub statyczne funkcje fabryczne) są zwykle na szczycie, ponieważ są pierwszą rzeczą, o której klienci muszą wiedzieć.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 20:26:38

Wiem, że to jest stare, ale mój rozkaz jest następujący:

W porządku publicznym, chronionym, prywatnym, wewnętrznym, abstrakcyjnym

  • stałe
  • Zmienne Statyczne
  • pola
  • Wydarzenia
  • Konstruktor(y)
  • metody
  • Właściwości
  • delegaci

Lubię też wypisywać takie właściwości (zamiast podejścia stenograficznego)

// 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-07 07:08:16