C# / .NET/01intro10 min

Konwencje nazewnictwa i styl C#

Spójny styl C# czyni kod przewidywalnym. ProfessNet trzyma się oficjalnych konwencji Microsoftu, a egzekwuje je automatycznie przez .editorconfig i analizatory Roslyn — nie w komentarzach do PR-a.

Nazewnictwo

ElementKonwencjaPrzykład
Klasa, metoda, właściwośćPascalCaseProbeService, RunScan
InterfejsI + PascalCaseIProbeRepository
Parametr, zmienna lokalnacamelCaseforestName
Pole prywatne_ + camelCase_repository
StałaPascalCaseMaxRetries
Pliknazwa typuProbeService.cs
public sealed class ProbeService : IProbeService
{
    private readonly IProbeRepository _repository;
    private const int MaxRetries = 3;

    public async Task<ScanResult> RunScanAsync(string forestName)
    {
        // ...
    }
}

Standard ProfessNet: pola prywatne mają prefiks _, metody asynchroniczne sufiks Async. Jedna publiczna klasa na plik, nazwa pliku = nazwa typu.

var — gdy typ jest oczywisty

// dobrze — typ widać po prawej stronie
var probes = new List<Probe>();
var result = await _service.RunScanAsync(forest);

// jawny typ — gdy z prawej strony nie wynika
int count = GetCount();

Standard ProfessNet: var używamy, gdy typ jest jasny z przypisania. Gdy nie jest oczywisty (np. int vs long), piszemy typ jawnie.

Nowoczesna składnia

C# rozwija się szybko — korzystamy z nowych konstrukcji, które skracają kod.

// expression-bodied members
public string FullHost => $"{Host}.{Forest}";

// pattern matching
var status = probe switch
{
    { IsActive: true } => "online",
    { LastSeen: null } => "never",
    _ => "offline",
};

// target-typed new
List<Probe> probes = new();

Formatowanie i nawiasy

Stosujemy styl Allman (klamra w nowej linii) i zawsze klamry przy if, nawet jednolinijkowym.

// dobrze
if (probe is null)
{
    return NotFound();
}

// źle — brak klamer, łatwo o błąd przy dopisaniu linii
if (probe is null) return NotFound();

.editorconfig — jedno źródło prawdy

Reguły stylu trzymamy w .editorconfig w katalogu solucji. Visual Studio i dotnet format respektują ten plik.

[*.cs]
indent_style = space
indent_size = 4
csharp_new_line_before_open_brace = all
dotnet_naming_rule.private_fields_underscore.severity = error
csharp_style_var_when_type_is_apparent = true:suggestion
dotnet format --verify-no-changes     # CI: sprawdza styl bez zmian

Wskazówka: włącz <Nullable>enable</Nullable> i <TreatWarningsAsErrors>true w .csproj. Wtedy ostrzeżenia stylu i nullability blokują build, zanim trafią na review.


Konwencje Microsoftu + .editorconfig + dotnet format w CI dają kod, który wygląda tak samo niezależnie od autora. Energię z review przenosimy na logikę, a nie na rozmieszczenie klamer.