perf: cache Result.Success() singleton#114
Merged
Merged
Conversation
4 tasks
Contributor
There was a problem hiding this comment.
Pull request overview
This PR optimizes the core Result API by caching a single successful Result instance and returning it from Result.Success() to eliminate repeated allocations on hot paths.
Changes:
- Added a cached singleton instance for successful
Resultvalues. - Updated
Result.Success()to return the cached instance and documented the caching behavior.
Chris-Wolfgang
added a commit
that referenced
this pull request
May 11, 2026
- Rename `SuccessInstance` to `_successInstance` to match the project's private-field naming convention (e.g., `_value`). - Expand XML <remarks> to call out that successful results returned from `Success()` are reference-equal, so callers must not use identity comparison to distinguish them. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Result is immutable, so Success() can return a single shared instance instead of allocating a new Result on every call. Eliminates allocations on hot paths where Success() is called frequently (Flatten, Try.Run, and consumer code). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Rename `SuccessInstance` to `_successInstance` to match the project's private-field naming convention (e.g., `_value`). - Expand XML <remarks> to call out that successful results returned from `Success()` are reference-equal, so callers must not use identity comparison to distinguish them. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add a test that asserts two consecutive `Result.Success()` calls return the same reference. This locks in the cached-singleton optimization introduced in this PR so any future change back to per-call allocation has to deliberately update the test. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bdc6637 to
7ae8337
Compare
Chris-Wolfgang
added a commit
that referenced
this pull request
May 11, 2026
- Rename `SuccessInstance` to `_successInstance` to match the project's private-field naming convention (e.g., `_value`). - Expand XML <remarks> to call out that successful results returned from `Success()` are reference-equal, so callers must not use identity comparison to distinguish them. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 tasks
Chris-Wolfgang
added a commit
that referenced
this pull request
May 19, 2026
Changes since v0.3.1: - fix: null-element validation in Result.Flatten / AllSucceeded / AnyFailed (#113) — previously calling `.Failed` on a null element threw NullReferenceException; now throws ArgumentException with the index of the offending element. Adds [NotNull] post-condition attribute to all three methods plus all Try.Run/RunAsync overloads. Polyfills NotNullAttribute for net462 / netstandard2.0. - perf: Result.Success() now returns a cached singleton instead of allocating per call (#114). Behavior is locked in by a test using Assert.Same; XML docs warn callers not to rely on reference identity. - perf: replace LINQ in Flatten / AllSucceeded / AnyFailed with index- based for-loops (#116). Flatten is now single-pass with a lazy StringBuilder so the common single-failure case has zero extra allocation. AllSucceeded / AnyFailed short-circuit on first failure, so a trailing null past the decisive element no longer throws (documented in <exception> XML and locked in by tests). - refactor: simplify Result ctor validation (#115) — switch-when replaced with two guard-clause ifs. No behavior change; exception messages and ParamName preserved. - chore: test cleanup (#117) — remove redundant inheritance- verification tests, fix tabs vs spaces, drop unused pragma. - chore(deps): Bump Meziantou.Analyzer 3.0.77 → 3.0.85 (#118). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Resultis immutable, soSuccess()can return a single shared instance instead of allocating on every call.Flatten,Try.Run, consumer code).Test plan
dotnet build -c Release— 0 warnings, 0 errorsdotnet test -c Release --framework net8.0— 97 passed🤖 Generated with Claude Code