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
| Element | Konwencja | Przykład |
|---|---|---|
| Klasa, metoda, właściwość | PascalCase | ProbeService, RunScan |
| Interfejs | I + PascalCase | IProbeRepository |
| Parametr, zmienna lokalna | camelCase | forestName |
| Pole prywatne | _ + camelCase | _repository |
| Stała | PascalCase | MaxRetries |
| Plik | nazwa typu | ProbeService.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 sufiksAsync. 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:
varużywamy, gdy typ jest jasny z przypisania. Gdy nie jest oczywisty (np.intvslong), 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>truew.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.