ktsu.ScopedAction
1.1.4
Prefix Reserved
dotnet add package ktsu.ScopedAction --version 1.1.4
NuGet\Install-Package ktsu.ScopedAction -Version 1.1.4
<PackageReference Include="ktsu.ScopedAction" Version="1.1.4" />
<PackageVersion Include="ktsu.ScopedAction" Version="1.1.4" />
<PackageReference Include="ktsu.ScopedAction" />
paket add ktsu.ScopedAction --version 1.1.4
#r "nuget: ktsu.ScopedAction, 1.1.4"
#:package ktsu.ScopedAction@1.1.4
#addin nuget:?package=ktsu.ScopedAction&version=1.1.4
#tool nuget:?package=ktsu.ScopedAction&version=1.1.4
ktsu.ScopedAction
A lightweight utility for executing paired actions at the start and end of code blocks.
Introduction
ktsu.ScopedAction
is a .NET utility that provides an abstract base class for executing actions at the beginning and end of code blocks. It implements the RAII (Resource Acquisition Is Initialization) pattern and leverages C#'s using
statement and the IDisposable
pattern to ensure that paired operations (like resource acquisition/release, state changes, or logging) are properly executed, even in the presence of exceptions.
As an abstract class, ScopedAction
is designed to be inherited and extended to create specialized scoped behavior classes tailored to specific use cases.
Features
- Abstract Base Class: Provides a foundation for creating specialized scoped action classes
- RAII Pattern: Implements Resource Acquisition Is Initialization for deterministic resource management
- Paired Actions: Execute actions when entering and exiting a scope
- Exception Safety: Cleanup actions execute even if exceptions occur
- Lightweight: Simple API with minimal overhead
- Inheritance-Based: Designed to be extended for domain-specific implementations
- Flexible: Works with any action delegates through protected constructor
- Resource Management: Follows .NET's standard disposal pattern
RAII (Resource Acquisition Is Initialization)
ktsu.ScopedAction
implements the RAII pattern, a programming idiom that binds the life cycle of a resource to the lifetime of an object. This ensures that:
- Automatic Resource Management: Resources are automatically acquired when the object is constructed and released when it's destroyed
- Exception Safety: Resources are properly released even if exceptions occur within the scope
- Deterministic Execution: The OnClose action is guaranteed to execute when the object goes out of scope
- Stack-Based Semantics: Leverages C#'s
using
statement to provide execution tied to lexical scope, mimicking C++ stack-based object destruction
The pattern is particularly useful for scenarios like:
- File operations (open/close)
- Database transactions (begin/commit or rollback)
- Lock management (acquire/release)
- Performance timing (start/stop)
- Temporary state changes (set/restore)
Installation
Package Manager Console
Install-Package ktsu.ScopedAction
.NET CLI
dotnet add package ktsu.ScopedAction
Package Reference
<PackageReference Include="ktsu.ScopedAction" Version="x.y.z" />
Usage Examples
The ScopedAction
class supports three main patterns, progressing from simple to more complex scenarios:
Example 1: Using static methods without parameters
using ktsu.ScopedAction;
public class ConsoleMarkerScope() : ScopedAction(Enter, Exit)
{
// Using method groups - no lambdas needed when methods match Action signature
private static void Enter() => Console.WriteLine("Entering scope");
private static void Exit() => Console.WriteLine("Exiting scope");
}
// Usage
using (new ConsoleMarkerScope())
{
// Any code here...
Console.WriteLine("Inside the scope");
}
// Output:
// Entering scope
// Inside the scope
// Exiting scope
Example 2: Using static methods with parameters
using ktsu.ScopedAction;
public class LoggingScope(string operation)
: ScopedAction(() => Enter(operation), () => Exit(operation))
{
// Using lambdas to capture constructor parameters for static methods
private static void Enter(string operation) => Console.WriteLine($"Entering: {operation}");
private static void Exit(string operation) => Console.WriteLine($"Exiting: {operation}");
}
// Usage
using (new LoggingScope("my operation"))
{
// Any code here...
Console.WriteLine("Inside the scope");
}
// Output:
// Entering: my operation
// Inside the scope
// Exiting: my operation
Example 3: Using instance members
using ktsu.ScopedAction;
// This approach enables access to instance members in the OnClose action
public class TimingScope : ScopedAction
{
private readonly DateTime startTime; // Instance field
private readonly string operation; // Instance field
public TimingScope(string operation)
{
this.operation = operation;
this.startTime = DateTime.Now;
// OnClose can reference instance method that accesses instance members
OnClose = LogExecutionTime;
// No need to assign an OnOpen action - it would execute immediately anyway.
// Instead, just perform the "on open" logic directly in the constructor.
Console.WriteLine($"Starting: {operation}");
}
// Instance method with access to instance fields
private void LogExecutionTime()
{
// Can directly access instance members: startTime, operation
var elapsed = DateTime.Now - startTime;
Console.WriteLine($"Completed: {operation} in {elapsed.TotalMilliseconds:F2}ms");
}
}
// Usage
using (new TimingScope("database query"))
{
// Simulate some work
Thread.Sleep(100);
Console.WriteLine("Executing query...");
}
// Output:
// Starting: database query
// Executing query...
// Completed: database query in 100.xx ms
Choosing the Right Pattern
Example 1 (Method Groups): Use when you have simple static methods with no parameters. This is the most concise approach.
Example 2 (Lambda Capture): Use when you need to pass constructor parameters to static methods. Lambdas capture the parameters from the constructor scope.
Example 3 (Instance Members): Use when your OnClose logic needs access to instance state (fields, properties, methods). This pattern is essential for:
- Complex resource management
- Stateful cleanup operations
- Scenarios where disposal behavior depends on data initialized during construction
The parameterless constructor approach gives you full access to the object's state, while the action-based constructors are limited to static methods and captured parameters.
API Reference
ScopedAction Class
An abstract base class for executing actions at scope boundaries. This class must be inherited to create concrete implementations.
Constructors
Constructor | Parameters | Description |
---|---|---|
ScopedAction(Action? onOpen, Action? onClose) |
onOpen : Action executed on construction<br>onClose : Action executed on disposal |
Protected constructor for derived classes that executes the onOpen action immediately and stores the onClose action for later execution during disposal |
ScopedAction() |
None | Protected parameterless constructor for derived classes that need custom initialization |
Properties
Property | Type | Description |
---|---|---|
OnClose |
Action? |
Protected property that stores the action to execute when the scoped action is disposed. Can be set by derived classes. |
Methods
Method | Return Type | Description |
---|---|---|
Dispose() |
void |
Public method that implements the IDisposable interface. Executes the OnClose action if not already disposed and suppresses finalization. |
Dispose(bool disposing) |
void |
Protected virtual method for implementing the standard .NET dispose pattern. Executes the OnClose action when disposing is true and handles multiple disposal calls safely. |
Contributing
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
Please make sure to update tests as appropriate.
License
This project is licensed under the MIT License - see the LICENSE.md file for details.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
-
net5.0
- No dependencies.
-
net6.0
- No dependencies.
-
net7.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (6)
Showing the top 5 NuGet packages that depend on ktsu.ScopedAction:
Package | Downloads |
---|---|
ktsu.ImGuiStyler
A library for expressively styling ImGui.NET interfaces. |
|
ktsu.ImGuiApp
A comprehensive .NET library that provides complete application scaffolding for Dear ImGui applications, featuring window management, DPI-aware rendering, precision PID-controlled frame limiting with comprehensive auto-tuning, advanced font handling with Unicode/emoji support, texture management, and debug tooling. Built on Silk.NET for cross-platform OpenGL support and Hexa.NET.ImGui for modern Dear ImGui bindings. |
|
ktsu.ImGuiWidgets
A library of custom widgets using ImGui.NET and utilities to enhance ImGui-based applications. |
|
ktsu.ImGuiPopups
A library for custom popups using ImGui.NET. |
|
ktsu.CodeBlocker
A specialized utility built on top of IndentedTextWriter that simplifies the process of programmatically generating structured code. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
1.1.4 | 167 | 8/7/2025 |
1.1.3 | 164 | 8/6/2025 |
1.1.3-pre.17 | 125 | 5/20/2025 |
1.1.3-pre.15 | 85 | 5/17/2025 |
1.1.3-pre.14 | 133 | 5/16/2025 |
1.1.3-pre.13 | 203 | 5/15/2025 |
1.1.3-pre.12 | 209 | 5/14/2025 |
1.1.3-pre.11 | 205 | 5/13/2025 |
1.1.3-pre.10 | 239 | 5/12/2025 |
1.1.3-pre.9 | 170 | 5/11/2025 |
1.1.3-pre.8 | 124 | 5/10/2025 |
1.1.3-pre.7 | 62 | 5/9/2025 |
1.1.3-pre.6 | 127 | 5/8/2025 |
1.1.3-pre.5 | 128 | 5/7/2025 |
1.1.3-pre.4 | 129 | 5/6/2025 |
1.1.3-pre.3 | 132 | 5/5/2025 |
1.1.3-pre.2 | 129 | 5/4/2025 |
1.1.3-pre.1 | 133 | 5/4/2025 |
1.1.2 | 553 | 5/4/2025 |
1.1.2-pre.1 | 64 | 4/26/2025 |
1.1.1 | 739 | 4/25/2025 |
1.1.1-pre.1 | 127 | 4/4/2025 |
1.1.0 | 1,392 | 3/30/2025 |
1.0.16-pre.2 | 84 | 3/29/2025 |
1.0.16-pre.1 | 468 | 3/25/2025 |
1.0.15 | 1,859 | 2/17/2025 |
1.0.15-pre.3 | 89 | 2/6/2025 |
1.0.15-pre.2 | 84 | 2/5/2025 |
1.0.15-pre.1 | 77 | 2/5/2025 |
1.0.14 | 2,414 | 12/27/2024 |
1.0.14-pre.28 | 77 | 2/3/2025 |
1.0.14-pre.27 | 74 | 2/3/2025 |
1.0.14-pre.26 | 76 | 2/1/2025 |
1.0.14-pre.25 | 82 | 1/30/2025 |
1.0.14-pre.24 | 67 | 1/28/2025 |
1.0.14-pre.23 | 78 | 1/26/2025 |
1.0.14-pre.22 | 65 | 1/24/2025 |
1.0.14-pre.21 | 76 | 1/22/2025 |
1.0.14-pre.20 | 70 | 1/20/2025 |
1.0.14-pre.19 | 70 | 1/18/2025 |
1.0.14-pre.18 | 67 | 1/16/2025 |
1.0.14-pre.17 | 50 | 1/14/2025 |
1.0.14-pre.16 | 72 | 1/13/2025 |
1.0.14-pre.15 | 69 | 1/11/2025 |
1.0.14-pre.14 | 70 | 1/10/2025 |
1.0.14-pre.13 | 73 | 1/10/2025 |
1.0.14-pre.12 | 65 | 1/8/2025 |
1.0.14-pre.11 | 80 | 1/7/2025 |
1.0.14-pre.10 | 79 | 1/6/2025 |
1.0.14-pre.9 | 100 | 1/4/2025 |
1.0.14-pre.8 | 82 | 1/3/2025 |
1.0.14-pre.7 | 83 | 1/3/2025 |
1.0.14-pre.6 | 76 | 1/3/2025 |
1.0.14-pre.5 | 85 | 1/2/2025 |
1.0.14-pre.4 | 97 | 12/31/2024 |
1.0.14-pre.3 | 72 | 12/29/2024 |
1.0.14-pre.2 | 68 | 12/28/2024 |
1.0.14-pre.1 | 76 | 12/27/2024 |
1.0.13-pre.1 | 70 | 12/27/2024 |
1.0.12 | 817 | 12/26/2024 |
1.0.11 | 113 | 12/26/2024 |
1.0.10 | 123 | 12/26/2024 |
1.0.10-pre.1 | 78 | 12/27/2024 |
1.0.9 | 110 | 12/26/2024 |
1.0.8 | 103 | 12/26/2024 |
1.0.7 | 106 | 12/26/2024 |
1.0.6 | 97 | 12/26/2024 |
1.0.5 | 945 | 12/23/2024 |
1.0.4 | 101 | 12/23/2024 |
1.0.3 | 152 | 12/22/2024 |
1.0.2 | 186 | 12/22/2024 |
1.0.1 | 671 | 12/12/2024 |
1.0.0 | 428 | 12/4/2024 |
1.0.0-alpha.22 | 284 | 12/2/2024 |
1.0.0-alpha.21 | 181 | 11/30/2024 |
1.0.0-alpha.20 | 236 | 11/26/2024 |
1.0.0-alpha.19 | 314 | 11/20/2024 |
1.0.0-alpha.18 | 356 | 11/13/2024 |
1.0.0-alpha.17 | 564 | 11/1/2024 |
1.0.0-alpha.16 | 1,011 | 10/4/2024 |
1.0.0-alpha.15 | 562 | 9/19/2024 |
1.0.0-alpha.14 | 171 | 9/19/2024 |
1.0.0-alpha.13 | 65 | 9/19/2024 |
1.0.0-alpha.12 | 81 | 9/19/2024 |
1.0.0-alpha.11 | 74 | 9/19/2024 |
1.0.0-alpha.10 | 121 | 9/19/2024 |
1.0.0-alpha.9 | 95 | 9/18/2024 |
1.0.0-alpha.8 | 84 | 9/18/2024 |
1.0.0-alpha.7 | 151 | 9/18/2024 |
1.0.0-alpha.6 | 251 | 9/18/2024 |
1.0.0-alpha.5 | 369 | 9/14/2024 |
1.0.0-alpha.4 | 87 | 9/14/2024 |
## v1.1.4 (patch)
Changes since v1.1.3:
- Enhance README and ScopedAction class documentation; improve unit tests ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.3 (patch)
Changes since v1.1.2:
- Refactor project configuration and add new SDK management workflow ([@matt-edmondson](https://github.com/matt-edmondson))
- Update configuration files and scripts for improved build and test processes ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.3-pre.17 (prerelease)
Changes since v1.1.3-pre.16:
- Sync scripts\PSBuild.psm1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Merge remote-tracking branch 'refs/remotes/origin/main' ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .mailmap ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitignore ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .runsettings ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitattributes ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.1.3-pre.16 (prerelease)
Changes since v1.1.3-pre.15:
- Sync .runsettings ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitattributes ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\PSBuild.psm1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitignore ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .mailmap ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.1.3-pre.15 (prerelease)
Changes since v1.1.3-pre.14:
## v1.1.3-pre.14 (prerelease)
Changes since v1.1.3-pre.13:
## v1.1.3-pre.13 (prerelease)
Changes since v1.1.3-pre.12:
## v1.1.3-pre.12 (prerelease)
Changes since v1.1.3-pre.11:
## v1.1.3-pre.11 (prerelease)
Changes since v1.1.3-pre.10:
## v1.1.3-pre.10 (prerelease)
Changes since v1.1.3-pre.9:
## v1.1.3-pre.9 (prerelease)
Changes since v1.1.3-pre.8:
## v1.1.3-pre.8 (prerelease)
Changes since v1.1.3-pre.7:
## v1.1.3-pre.7 (prerelease)
Changes since v1.1.3-pre.6:
## v1.1.3-pre.6 (prerelease)
Changes since v1.1.3-pre.5:
## v1.1.3-pre.5 (prerelease)
Changes since v1.1.3-pre.4:
## v1.1.3-pre.4 (prerelease)
Changes since v1.1.3-pre.3:
## v1.1.3-pre.3 (prerelease)
Changes since v1.1.3-pre.2:
## v1.1.3-pre.2 (prerelease)
Changes since v1.1.3-pre.1:
## v1.1.3-pre.1 (prerelease)
Incremental prerelease update.
## v1.1.2 (patch)
Changes since v1.1.1:
- Update DESCRIPTION.md to clarify utility purpose and change project SDK reference in ScopedAction.csproj ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove Directory.Build.props and Directory.Build.targets files, delete unused PowerShell scripts for versioning, changelog generation, and license creation. Add copyright notice to ScopedAction.cs. ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.2-pre.1 (prerelease)
Incremental prerelease update.
## v1.1.1 (patch)
Changes since v1.1.0:
- Update README to match standard template format ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.1-pre.1 (prerelease)
Incremental prerelease update.
## v1.1.0 (minor)
Changes since v1.0.0:
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
- Apply new editorconfig ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
- Add LICENSE template ([@matt-edmondson](https://github.com/matt-edmondson))
- Add automation scripts for metadata generation and project management ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.16-pre.2 (prerelease)
Changes since v1.0.16-pre.1:
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.16-pre.1 (prerelease)
Changes since v1.0.15:
- Sync .gitignore ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.15 (patch)
Changes since v1.0.14:
- Apply new editorconfig ([@matt-edmondson](https://github.com/matt-edmondson))
- Add automation scripts for metadata generation and project management ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.15-pre.3 (prerelease)
Changes since v1.0.15-pre.2:
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.15-pre.2 (prerelease)
Changes since v1.0.15-pre.1:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.15-pre.1 (prerelease)
Incremental prerelease update.
## v1.0.14 (patch)
No significant changes detected since v1.0.14-pre.28.
## v1.0.14-pre.28 (prerelease)
Changes since v1.0.14-pre.27:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14-pre.27 (prerelease)
Changes since v1.0.14-pre.26:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14-pre.26 (prerelease)
Changes since v1.0.14-pre.25:
## v1.0.14-pre.25 (prerelease)
Changes since v1.0.14-pre.24:
## v1.0.14-pre.24 (prerelease)
Changes since v1.0.14-pre.23:
- Bump MSTest from 3.7.2 to 3.7.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.14-pre.23 (prerelease)
Changes since v1.0.14-pre.22:
## v1.0.14-pre.22 (prerelease)
Changes since v1.0.14-pre.21:
## v1.0.14-pre.21 (prerelease)
Changes since v1.0.14-pre.20:
- Bump MSTest from 3.7.1 to 3.7.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.14-pre.20 (prerelease)
Changes since v1.0.14-pre.19:
- Bump coverlet.collector from 6.0.3 to 6.0.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.14-pre.19 (prerelease)
Changes since v1.0.14-pre.18:
## v1.0.14-pre.18 (prerelease)
Changes since v1.0.14-pre.17:
## v1.0.14-pre.17 (prerelease)
Changes since v1.0.14-pre.16:
- Bump MSTest from 3.7.0 to 3.7.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.14-pre.16 (prerelease)
Changes since v1.0.14-pre.15:
## v1.0.14-pre.15 (prerelease)
Changes since v1.0.14-pre.14:
## v1.0.14-pre.14 (prerelease)
Changes since v1.0.14-pre.13:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14-pre.13 (prerelease)
Changes since v1.0.14-pre.12:
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14-pre.12 (prerelease)
Changes since v1.0.14-pre.11:
## v1.0.14-pre.11 (prerelease)
Changes since v1.0.14-pre.10:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14-pre.10 (prerelease)
Changes since v1.0.14-pre.9:
## v1.0.14-pre.9 (prerelease)
Changes since v1.0.14-pre.8:
## v1.0.14-pre.8 (prerelease)
Changes since v1.0.14-pre.7:
- Sync .mailmap ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14-pre.7 (prerelease)
Changes since v1.0.14-pre.6:
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14-pre.6 (prerelease)
Changes since v1.0.14-pre.5:
- Add automation scripts for metadata generation and project management ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.14-pre.5 (prerelease)
Changes since v1.0.14-pre.4:
## v1.0.14-pre.4 (prerelease)
Changes since v1.0.14-pre.3:
- Bump coverlet.collector from 6.0.2 to 6.0.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.14-pre.3 (prerelease)
Changes since v1.0.14-pre.2:
## v1.0.14-pre.2 (prerelease)
Changes since v1.0.14-pre.1:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14-pre.1 (prerelease)
Incremental prerelease update.
## v1.0.13-pre.1 (prerelease)
Changes since v1.0.12:
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.12 (patch)
Changes since v1.0.11:
- Sync icon.png ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.11 (patch)
Changes since v1.0.10:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.10 (patch)
Changes since v1.0.9:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.10-pre.1 (prerelease)
Changes since v1.0.10:
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.9 (patch)
Changes since v1.0.8:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.8 (patch)
Changes since v1.0.7:
- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.7 (patch)
Changes since v1.0.6:
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.6 (patch)
Changes since v1.0.5:
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync icon.png ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.5 (patch)
Changes since v1.0.4:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.4 (patch)
Changes since v1.0.3:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.3 (patch)
Changes since v1.0.2:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.2 (patch)
Changes since v1.0.1:
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.1 (patch)
Changes since v1.0.0:
- Bump MSTest.TestAdapter from 3.6.3 to 3.6.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.0-alpha.22 (prerelease)
Changes since v1.0.0-alpha.21:
- Update VERSION to 1.0.0-alpha.22 ([@matt-edmondson](https://github.com/matt-edmondson))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.21 (prerelease)
Changes since v1.0.0-alpha.20:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Update VERSION to 1.0.0-alpha.21 ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0-alpha.20 (prerelease)
Changes since v1.0.0-alpha.19:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Update VERSION to 1.0.0-alpha.20 ([@matt-edmondson](https://github.com/matt-edmondson))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.19 (prerelease)
Changes since v1.0.0-alpha.18:
- Update VERSION to 1.0.0-alpha.19 ([@matt-edmondson](https://github.com/matt-edmondson))
- Bump Microsoft.NET.Test.Sdk in the microsoft group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.0-alpha.18 (prerelease)
Changes since v1.0.0-alpha.17:
- Bump MSTest.TestFramework from 3.6.2 to 3.6.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Update VERSION to 1.0.0-alpha.18 ([@matt-edmondson](https://github.com/matt-edmondson))
- Bump MSTest.TestAdapter from 3.6.2 to 3.6.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.0-alpha.17 (prerelease)
Changes since v1.0.0-alpha.16:
- Bump MSTest.TestAdapter from 3.6.0 to 3.6.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Update VERSION to 1.0.0-alpha.17 ([@matt-edmondson](https://github.com/matt-edmondson))
- Bump MSTest.TestFramework from 3.6.1 to 3.6.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.0-alpha.16 (prerelease)
Changes since v1.0.0-alpha.15:
- Bump MSTest.TestFramework from 3.6.0 to 3.6.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Update VERSION to 1.0.0-alpha.16 ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0-alpha.15 (prerelease)
Changes since v1.0.0-alpha.14:
- Update VERSION to 1.0.0-alpha.15 ([@matt-edmondson](https://github.com/matt-edmondson))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.14 (prerelease)
Changes since v1.0.0-alpha.13:
- Update VERSION to 1.0.0-alpha.14 ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0-alpha.13 (prerelease)
Changes since v1.0.0-alpha.12:
- Update VERSION to 1.0.0-alpha.13 ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0-alpha.12 (prerelease)
Changes since v1.0.0-alpha.11:
- Update VERSION to 1.0.0-alpha.12 ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0-alpha.11 (prerelease)
Changes since v1.0.0-alpha.10:
- Update VERSION to 1.0.0-alpha.11 ([@matt-edmondson](https://github.com/matt-edmondson))
- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.10 (prerelease)
Changes since v1.0.0-alpha.9:
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.9 (prerelease)
Changes since v1.0.0-alpha.8:
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.8 (prerelease)
Changes since v1.0.0-alpha.7:
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.7 (prerelease)
Changes since v1.0.0-alpha.6:
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump MSTest.TestFramework from 3.5.2 to 3.6.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestAdapter from 3.5.2 to 3.6.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.6 (prerelease)
Changes since v1.0.0-alpha.5:
- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.0-alpha.5 (prerelease)
Changes since v1.0.0-alpha.4:
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0-alpha.4 (prerelease)
Incremental prerelease update.
## v1.0.0 (major)
- Update Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- 1.0.0-alpha.4 ([@matt-edmondson](https://github.com/matt-edmondson))
- Update build config ([@matt-edmondson](https://github.com/matt-edmondson))
- Update nuget.config ([@matt-edmondson](https://github.com/matt-edmondson))
- Update nuget.config ([@matt-edmondson](https://github.com/matt-edmondson))
- Add github package support ([@matt-edmondson](https://github.com/matt-edmondson))
- Initial commit ([@matt-edmondson](https://github.com/matt-edmondson))
- Dont automatically run the OnOpen in the trivial constructor, derived classes should call it explicitly ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
- Allow delegates to be set in derived constructors ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.targets ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.targets ([@matt-edmondson](https://github.com/matt-edmondson))