| name | coding-conventions |
| description | Use when applying or enforcing C# coding style — namespaces, sealed classes, var usage, XML docs. |
| when_to_use | Use when applying or enforcing C# coding style — namespaces, sealed classes, var usage, XML docs. |
| metadata | {"category":"core","agent":"dotnet-architect"} |
Coding Conventions
File Organization
namespace {Company}.{Domain}.Application.Features;
Class Conventions
public sealed class OrderService(IUnitOfWork unitOfWork) : IOrderService
{
private readonly IUnitOfWork _unitOfWork = unitOfWork;
public Task<Order?> GetByIdAsync(Guid id, CancellationToken ct) =>
_unitOfWork.Orders.FindAsync(id, ct);
}
Naming Rules
| Element | Convention | Example |
|---|
| Classes | PascalCase | OrderService |
| Interfaces | I + PascalCase | IOrderService |
| Methods | PascalCase | GetOrdersAsync |
| Async methods | Suffix Async | SaveChangesAsync |
| Properties | PascalCase | TotalAmount |
| Private fields | _camelCase | _unitOfWork |
| Parameters | camelCase | orderId |
| Constants | PascalCase | MaxRetryCount |
| Enums | PascalCase (singular) | OrderStatus |
Var Usage
var order = new Order();
var orders = await _repository.GetAllAsync(ct);
var count = orders.Count;
decimal total = CalculateTotal(items);
IOrderService service = GetService();
Records and DTOs
public sealed record CreateOrderCommand(
string CustomerName,
decimal Total,
List<OrderItemDto> Items) : IRequest<Result<Guid>>;
public sealed record OrderOutput(
Guid Id,
string CustomerName,
decimal Total,
string Status);
Async Patterns
public async Task<Result<Order>> Handle(
CreateOrderCommand request,
CancellationToken cancellationToken)
{
var order = await _repository.FindAsync(request.Id, cancellationToken);
}
Null Handling
public Order? FindById(Guid id) => ...
if (order is null)
throw new NotFoundException(nameof(Order), id);
var name = order?.CustomerName ?? "Unknown";
XML Documentation
public Task<Result<Guid>> Handle(CreateOrderCommand command, CancellationToken cancellationToken);
Anti-Patterns
| Anti-Pattern | Correct Approach |
|---|
public string Name { get; set; } on domain entities | public string Name { get; private set; } |
async void methods | Always return Task or Task<T> |
.Result or .Wait() on tasks | Always await |
Catching generic Exception | Catch specific exceptions |
| String concatenation for SQL | Parameterized queries |
DateTime.Now | Injected TimeProvider or ISystemClock |
Detect Existing Patterns
grep -r "namespace " --include="*.cs" | head -5
grep -r "sealed class" --include="*.cs" | wc -l
grep -r "var " --include="*.cs" | head -10
Adding to Existing Project
- Follow whatever conventions the project already uses
- Only apply these when no existing convention is detected
Related rules
This skill depends on the always-on coding-style convention rule:
- ${CLAUDE_PLUGIN_ROOT}/rules/conventions/coding-style.md
The rule is loaded into context whenever this skill is active (FR-011 universal whitelist).
3. Check .editorconfig for project-specific overrides