Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when building C# applications with .NET 8+, ASP.NET Core APIs, or Blazor web apps. Builds REST APIs using minimal or controller-based routing, configures database access with Entity Framework Core, implements async patterns and cancellation, structures applications with CQRS via MediatR, and scaffolds Blazor components with state management. Invoke for C#, .NET, ASP.NET Core, Blazor, Entity Framework, EF Core, Minimal API, MAUI, SignalR.
.claude/skills/jeffallan-csharp-developer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 33% | 0% |
Senior C# developer with mastery of .NET 8+ and Microsoft ecosystem. Specializes in high-performance web APIs, cloud-native solutions, and modern C# language features.
> EF Core checkpoint (after step 3): Run dotnet ef migrations add <Name> and review the generated migration file before applying. Confirm no unintended table/column drops. Roll back with dotnet ef migrations remove if needed.
Load detailed guidance based on context:
| Topic | Reference | Load When | |-------|-----------|-----------| | Modern C# | references/modern-csharp.md | Records, pattern matching, nullable types | | ASP.NET Core | references/aspnet-core.md | Minimal APIs, middleware, DI, routing | | Entity Framework | references/entity-framework.md | EF Core, migrations, query optimization | | Blazor | references/blazor.md | Components, state management, interop | | Performance | references/performance.md | Span<T>, async, memory optimization, AOT |
CancellationToken:csharp // Correct app.MapGet("/items/{id}", async (int id, IItemService svc, CancellationToken ct) => await svc.GetByIdAsync(id, ct) is { } item ? Results.Ok(item) : Results.NotFound());
csharp public readonly record struct Result<T>(T? Value, string? Error, bool IsSuccess) { public static Result<T> Ok(T value) => new(value, null, true); public static Result<T> Fail(string error) => new(default, error, false); }
IOptions<T>.Result, .Wait()) in async code:csharp // Wrong — blocks thread and risks deadlock var data = service.GetDataAsync().Result;
// Correct var data = await service.GetDataAsync(ct);
When implementing .NET features, provide:
csharp// Program.cs (file-scoped, .NET 8 minimal API) var builder = WebApplication.CreateBuilder(args); builder.Services.AddScoped<IProductService, ProductService>(); var app = builder.Build(); app.MapGet("/products/{id:int}", async ( int id, IProductService service, CancellationToken ct) => { var result = await service.GetByIdAsync(id, ct); return result.IsSuccess ? Results.Ok(result.Value) : Results.NotFound(result.Error); }) .WithName("GetProduct") .Produces<ProductDto>() .ProducesProblem(404); app.Run();
C# 12, .NET 8, ASP.NET Core, Minimal APIs, Blazor (Server/WASM), Entity Framework Core, MediatR, xUnit, Moq, Benchmark.NET, SignalR, gRPC, Azure SDK, Polly, FluentValidation, Serilog
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→pass | 22,791 | 19,402 | -15% | 1 | 1 | 0% | 4,510 | 5,298 | +17% | 0 | 0 | — |
case-03 | fail→pass | 19,670 | 22,310 | +13% | 1 | 1 | 0% | 4,099 | 5,834 | +42% | 0 | 0 | — |
case-04 | pass→pass | 10,464 | 12,253 | +17% | 1 | 1 | 0% | 2,044 | 3,540 | +73% | 0 | 0 | — |
case-15 | pass→pass | 16,164 | 12,489 | -23% | 1 | 1 | 0% | 2,897 | 3,296 | +14% | 0 | 0 | — |
case-01 | fail→pass | 15,550 | 15,107 | -3% | 1 | 1 | 0% | 2,972 | 4,204 | +41% | 0 | 0 | — |
case-05 | pass→pass | 14,897 | 12,292 | -17% | 1 | 1 | 0% | 2,573 | 3,710 | +44% | 0 | 0 | — |
case-06 | pass→pass | 8,425 | 11,504 | +37% | 1 | 1 | 0% | 1,683 | 3,353 | +99% | 0 | 0 | — |
case-07 | fail→fail | 15,113 | 15,161 | +0% | 1 | 1 | 0% | 2,654 | 4,395 | +66% | 0 | 0 | — |
case-08 | pass→fail | 11,623 | 14,080 | +21% | 1 | 1 | 0% | 2,283 | 3,714 | +63% | 0 | 0 | — |
case-09 | fail→pass | 14,940 | 5,884 | -61% | 1 | 1 | 0% | 1,290 | 1,794 | +39% | 0 | 0 | — |
case-10 | fail→pass | 14,506 | 11,880 | -18% | 1 | 1 | 0% | 2,635 | 3,514 | +33% | 0 | 0 | — |
case-11 | pass→pass | 14,080 | 12,376 | -12% | 1 | 1 | 0% | 2,782 | 3,792 | +36% | 0 | 0 | — |
case-12 | pass→pass | 9,139 | 9,160 | +0% | 1 | 1 | 0% | 1,562 | 2,672 | +71% | 0 | 0 | — |
case-13 | fail→pass | 15,742 | 19,083 | +21% | 1 | 1 | 0% | 3,307 | 5,279 | +60% | 0 | 0 | — |
case-14 | pass→pass | 11,438 | 14,390 | +26% | 1 | 1 | 0% | 2,322 | 4,148 | +79% | 0 | 0 | — |
case-16 | pass→pass | 18,424 | 14,664 | -20% | 1 | 1 | 0% | 3,334 | 3,656 | +10% | 0 | 0 | — |
case-17 | fail→fail | 11,013 | 11,616 | +5% | 1 | 1 | 0% | 2,084 | 3,179 | +53% | 0 | 0 | — |
case-18 | fail→fail | 12,955 | 13,613 | +5% | 1 | 1 | 0% | 2,441 | 3,690 | +51% | 0 | 0 | — |
case-19 | pass→pass | 8,610 | 7,312 | -15% | 1 | 1 | 0% | 1,418 | 2,382 | +68% | 0 | 0 | — |
case-20 | pass→pass | 10,461 | 11,884 | +14% | 1 | 1 | 0% | 2,130 | 3,506 | +65% | 0 | 0 | — |
case-21 | pass→pass | 12,649 | 12,435 | -2% | 1 | 1 | 0% | 2,476 | 3,508 | +42% | 0 | 0 | — |
case-22 | pass→pass | 13,353 | 29,673 | +122% | 1 | 1 | 0% | 2,663 | 4,519 | +70% | 0 | 0 | — |
case-23 | pass→pass | 5,179 | 6,467 | +25% | 1 | 1 | 0% | 781 | 2,199 | +182% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +22 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.