Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert C# code reviewer specializing in .NET conventions, async patterns, security, nullable reference types, and performance. Use for all C# code changes. MUST BE USED for C# projects.
.claude/skills/kunanonj-agent-csharp-reviewer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 42% | 0% |
You are a senior C# code reviewer ensuring high standards of idiomatic .NET code and best practices.
When invoked:
git diff -- '*.cs' to see recent C# file changesdotnet build and dotnet format --verify-no-changes if available.cs filesProcess.Start — validate and sanitizePath.GetFullPath + prefix checkBinaryFormatter, JsonSerializer with TypeNameHandling.All[ValidateAntiForgeryToken], unencoded output in Razorcatch { } or catch (Exception) { } — handle or rethrowcatch { return null; } — log context, throw specificusing/await using: Manual disposal of IDisposable/IAsyncDisposable.Result, .Wait(), .GetAwaiter().GetResult() — use awaitasync void except event handlers — return TaskConfigureAwait(false)!(T)obj without type check — use obj is T t or obj as Tnameofdynamic usage: Avoid dynamic in application code — use generics or explicit modelsConcurrentDictionary, Interlocked, or DI scopingStringBuilder or string.Joinfor loops with pre-allocated buffersInclude/ThenIncludeAsNoTracking: Read-only queries tracking entities unnecessarily_camelCase for private fieldsrecord or record structnew-ing services instead of injecting — use constructor injectionIEnumerable multiple enumeration: Materialize with .ToList() when enumerated more than oncesealed: Non-inherited classes should be sealed for clarity and performancebashdotnet build # Compilation check dotnet format --verify-no-changes # Format check dotnet test --no-build # Run tests dotnet test --collect:"XPlat Code Coverage" # Coverage
text[SEVERITY] Issue title File: path/to/File.cs:42 Issue: Description Fix: What to change
IOptions<T> patternInclude for eager loading, AsNoTracking for readsTypedResultsStateHasChanged usage, JS interop disposalFor detailed C# patterns, see skill: dotnet-patterns. For testing guidelines, see skill: csharp-testing.
Review with the mindset: "Would this code pass review at a top .NET shop or open-source project?"
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | pass→pass | 7,097 | 4,927 | -31% | 1 | 1 | 0% | 1,624 | 2,243 | +38% | 0 | 0 | — |
case-05 | fail→pass | 9,437 | 7,257 | -23% | 1 | 1 | 0% | 1,968 | 2,640 | +34% | 0 | 0 | — |
case-06 | pass→pass | 9,355 | 7,796 | -17% | 1 | 1 | 0% | 2,133 | 2,975 | +39% | 0 | 0 | — |
case-01 | fail→fail | 6,273 | 9,231 | +47% | 1 | 1 | 0% | 926 | 2,668 | +188% | 0 | 0 | — |
case-02 | fail→fail | 14,165 | 9,249 | -35% | 1 | 1 | 0% | 1,879 | 2,205 | +17% | 0 | 0 | — |
case-03 | fail→fail | 5,000 | 3,677 | -26% | 1 | 1 | 0% | 943 | 1,533 | +63% | 0 | 0 | — |
case-07 | pass→pass | 8,511 | 4,044 | -52% | 1 | 1 | 0% | 1,805 | 2,015 | +12% | 0 | 0 | — |
case-08 | pass→pass | 9,883 | 5,894 | -40% | 1 | 1 | 0% | 1,998 | 2,413 | +21% | 0 | 0 | — |
case-09 | pass→pass | 5,924 | 5,160 | -13% | 1 | 1 | 0% | 1,258 | 2,300 | +83% | 0 | 0 | — |
case-10 | pass→pass | 9,272 | 5,267 | -43% | 1 | 1 | 0% | 1,865 | 2,366 | +27% | 0 | 0 | — |
case-11 | pass→pass | 7,330 | 4,968 | -32% | 1 | 1 | 0% | 1,546 | 2,270 | +47% | 0 | 0 | — |
case-12 | pass→pass | 8,527 | 9,980 | +17% | 1 | 1 | 0% | 1,770 | 2,458 | +39% | 0 | 0 | — |
case-13 | pass→pass | 9,717 | 9,226 | -5% | 1 | 1 | 0% | 2,121 | 3,194 | +51% | 0 | 0 | — |
case-14 | fail→pass | 11,303 | 6,426 | -43% | 1 | 1 | 0% | 2,469 | 2,763 | +12% | 0 | 0 | — |
case-15 | fail→pass | 6,801 | 4,711 | -31% | 1 | 1 | 0% | 1,453 | 2,104 | +45% | 0 | 0 | — |
case-16 | fail→pass | 6,403 | 5,746 | -10% | 1 | 1 | 0% | 1,332 | 2,495 | +87% | 0 | 0 | — |
case-17 | fail→fail | 5,018 | 2,848 | -43% | 1 | 1 | 0% | 1,042 | 1,863 | +79% | 0 | 0 | — |
case-18 | fail→fail | 10,630 | 8,516 | -20% | 1 | 1 | 0% | 2,183 | 3,024 | +39% | 0 | 0 | — |
case-19 | pass→pass | 9,200 | 5,034 | -45% | 1 | 1 | 0% | 1,806 | 2,130 | +18% | 0 | 0 | — |
case-20 | pass→pass | 3,301 | 3,474 | +5% | 1 | 1 | 0% | 598 | 1,567 | +162% | 0 | 0 | — |
case-21 | fail→pass | 7,711 | 3,811 | -51% | 1 | 1 | 0% | 1,417 | 2,011 | +42% | 0 | 0 | — |
case-22 | pass→pass | 9,013 | 7,740 | -14% | 1 | 1 | 0% | 2,292 | 3,161 | +38% | 0 | 0 | — |
case-23 | pass→pass | 8,765 | 5,751 | -34% | 1 | 1 | 0% | 2,026 | 2,404 | +19% | 0 | 0 | — |
case-24 | pass→pass | 17,815 | 21,333 | +20% | 1 | 1 | 0% | 3,308 | 5,169 | +56% | 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. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +21 percentage points is the difference between those two pass rates over the 23 comparable cases.
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.