Nevymýšľame koleso - coding style je prebratý z projektu corefx (a väčšina pravidiel je "použi predvolený štýl Visual Studia").
Aby sme to mali jednoduchšie, je vytvorený .editorconfig
, ktorý si dajte do projektu.
- Krútené zátvorky píšeme na samostatný riadok. Jednoriadkový príkaz môžeme napísať bez krútených zátvoriek, ale musí byť na samostatnom riadku a správne odsadený. V prípade že ide o skupinu
if ... [else if ... else if ...] else
, tak buď sú krútené zátvorky vo všetkých vetvách, alebo nikde - tzn. nie je niektorá vetva so zátvorkami a iná bez nich. Pri definovaní telaget
,set
metód jednoduchých vlastností môžu byť krútené zátvorky aj s príkazom na jednom riadku (get { return _value; }
). - Na odsadenie sa používame 4 medzery (nie tabulátory).
- Privátne členy pomenovávame
_camelCase
a kde je to možné, použijemereadonly
. Privátne a interné (internal
) členy majú prefix_
. Ak je člen statický, kľúčové slovoreadonly
je zastatic
(tzn.static readonly
, niereadonly static
). Verejné členy nepoužívame a ak naozaj je taká potreba, tak ich názov jePascalCase
bez prefixu. - Ak to nie je vyslovene nutné, nepoužívame
this.
. - Vždy explicitne špecifikujeme viditeľnosť, teda aj v prípade, ak je rovnaká ako predvolená (tzn. použije sa
private string _foo
a niestring _foo
). Viditeľnosť je vždy prvý modifikátor (public abstract
, nieabstract public
). - Import namespace-ov je vždy na začiatku súboru a je zotriedený podľa abecedy. Abecedne zotriedené sú všetky importy ako celok, tzn. aj systémové (vo Visual Studiu sa dá zapnúť, aby systémové dával na začiatok - to nechceme).
- Nikde nepoužívame viac ako jeden prázdny riadok za sebou.
- Zbytočné medzery na konci riadkov odstraňujeme. Do plného Visual Studia, aj do VS Code sú na to rozšírenia, ktoré to robia automaticky.
- Kľúčové slovo
var
používame iba v prípade, že je úplne jasný typ danej premennej (var stream = new FileStream(...)
, nievar stream = OpenStream(...)
). - Dátové typy zapisujeme kľúčovými slovami jazyka a nie typmi BCL (napr.
int
,string
,float
namiestoInt32
,String
,Single
). Toto sa používa aj na volania metód (napr.int.Parse
namiestoInt32.Parse
). - Konštanty pomenovávame štýlom
PascalCase
. Výnimky sú interop konštanty (konštanty z Windows API). Tie zapisujeme rovnako ako sú vo Windows API. - Vždy keď je to relevantné, používame
nameof(...)
namiesto reťazca"..."
. - Definície všetkých privátnych členov sú na začiatku triedy (typu).
- Dĺžka riadku je obmedzená na 130 znakov. Ak je to dlhšie (aj o jeden znak), treba to rozumne zalomiť na dva riadky. Výnimka sú zdrojáky v unit testových knižniciach, kde sa relatívne často stane že sú dlhé riadky (napríklad kvôli informačným textom ak by test neprešiel). Tam je možné nechať riadky dlhšie, ak by zalamovanie len zhoršilo čitateľnosť.
- Pri zalamovaní riadkov operátory
.
,=>
,?:
,:
dávame na začiatok ďalšieho riadku a nie na koniec predošlého. Výnimka je pri operátore=>
ak je použitý v parametre metódy, ktorý je lambda funkciou. Ak takáto funkcia má telo na viac riadkov (jej telo je blok{ ... }
), tak operátor je na konci.
public class LineBreaks
{
public LineBreaks() : base()
{
}
public LineBreaks(string parameter1, string parameter2, string parameter3)
: base(parameter1, parameter2, parameter3)
{
}
private override void FooShort() => base.FooShort();
private override void FooWithNameTooLongForOneLine()
=> base.FooWithNameTooLongForOneLine();
private void LambdaAsMethodArgument(IWebHostBuilder builder) {
builder.ConfigureServices(services =>
{
services.AddSingleton<IEmailSender, SmtpEmailSender>();
services.AddTransient<ILogger>(serviceProvider => new Logger());
});
}
private void Bar()
{
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryClients(clients.Value);
}
private void TernaryOperator(int count, string primaryKeyName)
{
int total = count > 0 ? count * _itemPrice : 0;
IndexSchema primaryKey = string.IsNullOrWhiteSpace(primaryKeyName)
? null
: new IndexSchema(primaryKeyName, IndexType.PrimaryKey);
}
}
- Ak je hlavička metódy príliš dlhá, zalamujú sa jej parametre, pričom sú zalomenú buď všetky (aj prvý), alebo žiaden (ak sa zmestí na riadok).
private void Foo(int param1, string param2, string param3)
{
}
private void Bar(
int param1,
string param2,
string param3)
{
}
- Verejné veci sú popísané dokumentačnými komentármi.
- Všeobecné komentáre priamo v zdrojákoch sa píšu podľa potreby. Dôležité je, aby komentár hovoril o tom, prečo je niečo spravené tak ako je.