| name | swe-programming-csharp |
| description | C# coding standards from authoritative docs/explanation/software-engineering/programming-languages/c-sharp/ documentation |
C# Coding Standards
Purpose
Progressive disclosure of C# coding standards for agents writing C# code.
Usage: Auto-loaded for agents when writing C# code. Provides quick reference to idioms, best practices, and antipatterns.
Authoritative Source: docs/explanation/software-engineering/programming-languages/c-sharp/README.md
Prerequisite Knowledge
IMPORTANT: This skill provides demo-specific style guides, not educational tutorials.
Complete the demo C# learning path first:
Quick Standards Reference
Naming Conventions
Classes/Interfaces/Methods/Properties: PascalCase
ZakatCalculator, IZakatRepository, CalculateAmount(), TotalWealth
Local Variables/Parameters: camelCase
zakatAmount, nisabThreshold, paymentDate
Private Fields: _camelCase prefix
private readonly IZakatRepository _repository;
Constants: PascalCase
public const decimal ZakatRate = 0.025m;
Nullable Reference Types
public string ContractId { get; init; } = string.Empty;
public string? Notes { get; init; }
var value = GetValue()!;
Records for Value Objects
public record ZakatCalculation(
decimal Wealth,
decimal Nisab,
decimal Amount,
DateOnly CalculationDate
)
{
public static ZakatCalculation Calculate(decimal wealth, decimal nisab)
{
var amount = wealth >= nisab ? wealth * 0.025m : 0m;
return new ZakatCalculation(wealth, nisab, amount, DateOnly.FromDateTime(DateTime.UtcNow));
}
}
Async/Await
public async Task<ZakatCalculation> CalculateAsync(
decimal wealth,
CancellationToken cancellationToken = default)
{
var nisab = await _repository.GetCurrentNisabAsync(cancellationToken);
return ZakatCalculation.Calculate(wealth, nisab);
}
public ZakatCalculation Calculate(decimal wealth)
{
var nisab = _repository.GetCurrentNisabAsync().Result;
return ZakatCalculation.Calculate(wealth, nisab);
}
Error Handling
app.UseExceptionHandler(exceptionHandlerApp =>
exceptionHandlerApp.Run(async context =>
{
context.Response.ContentType = "application/problem+json";
var problemDetails = new ProblemDetails
{
Status = StatusCodes.Status500InternalServerError,
Title = "An unexpected error occurred"
};
await context.Response.WriteAsJsonAsync(problemDetails);
}));
public Result<ZakatCalculation> Calculate(decimal wealth, decimal nisab)
{
if (wealth < 0)
return Result.Failure<ZakatCalculation>("Wealth cannot be negative");
return Result.Success(ZakatCalculation.Calculate(wealth, nisab));
}
Testing with xUnit and FluentAssertions
public class ZakatCalculatorTests
{
[Theory]
[InlineData(10000, 5000, 250)]
[InlineData(3000, 5000, 0)]
public async Task CalculateAsync_ReturnsCorrectAmount(
decimal wealth, decimal nisab, decimal expectedAmount)
{
var mockRepo = new Mock<IZakatRepository>();
mockRepo.Setup(r => r.GetCurrentNisabAsync(It.IsAny<CancellationToken>()))
.ReturnsAsync(nisab);
var calculator = new ZakatCalculator(mockRepo.Object);
var result = await calculator.CalculateAsync(wealth);
result.Amount.Should().Be(expectedAmount);
}
}
Comprehensive Documentation
Authoritative Index: docs/explanation/software-engineering/programming-languages/c-sharp/README.md
Mandatory Standards
- Coding Standards
- Testing Standards
- Code Quality Standards
- Build Configuration
Context-Specific Standards
- Error Handling
- Concurrency
- Type Safety
- Performance
- Security
- API Standards
- DDD Standards
- Framework Integration
Related Skills
- docs-applying-content-quality
- repo-practicing-trunk-based-development
References