SpanWriter now has an argument that allows it to be resizable.
```cs
public SpanWriter(Span<byte> initialBuffer, bool resize = false)
public SpanWriter(int initialCapacity, bool resize = false)
```
If a SpanWriter is set to be resizable, or given an initial capacity instead of a buffer, it must be disposed:
```cs
public static void SomeMethod()
{
using var writer = new SpanWriter(stackalloc byte[512], true);
// stuff
// Automatic Dispose of writer
}
```
This is because the SpanWriter uses `ArrayPool<byte>.Shared` _rented buffers_ to resize. If the writer is not disposed, those buffers will never be reused resulting in a _memory leak_.
It is possible that the SpanWriter will outright ditch the initial buffer if resize is set to true and growing is needed. To check/account for that we can do the following:
```cs
public static void SomeMethod()
{
Span<byte> span = stackalloc byte[512];
using var writer = new SpanWriter(span, true);
// write some stuff that causes the span to grow
span = writer.RawBuffer;
// Do stuff with the span
}
```
Make sure you don't accidentally `Dispose()` the writer or use the `RawBuffer` outside of the `using` block. If you do, bad things will happen! (NullPointerException, or a fresh SpanWriter with no buffer, depending on the situation).
SpanWriter can also now be used with a fixed statement since it has a `PinnableReference()` function.
61 lines
3.5 KiB
XML
61 lines
3.5 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<Project>
|
|
<PropertyGroup>
|
|
<Authors>Kamron Batman</Authors>
|
|
<Company>ModernUO</Company>
|
|
<Copyright>2019-2020</Copyright>
|
|
<TargetFramework>net5.0</TargetFramework>
|
|
<Platforms>x64</Platforms>
|
|
<PlatformTarget>x64</PlatformTarget>
|
|
<LangVersion>9</LangVersion>
|
|
<PublicRelease>true</PublicRelease>
|
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
|
<NoWarn>NU1603</NoWarn>
|
|
<RuntimeIdentifiers>win-x64;debian.10-x64;debian.9-x64;ubuntu.16.04-x64;ubuntu.18.04-x64;ubuntu.20.04-x64;centos.7-x64;centos.8-x64;osx-x64</RuntimeIdentifiers>
|
|
<Configurations>Debug;Release;Analyze</Configurations>
|
|
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
|
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
<WarningsAsErrors />
|
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
<SkipLocalsInitAttribute>false</SkipLocalsInitAttribute>
|
|
<IsWindows Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true'">true</IsWindows>
|
|
<IsOSX Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))' == 'true'">true</IsOSX>
|
|
<IsLinux Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">true</IsLinux>
|
|
<DefineConstants Condition="'$(IsWindows)'=='true'">WINDOWS</DefineConstants>
|
|
<DefineConstants Condition="'$(IsOSX)'=='true'">OSX</DefineConstants>
|
|
<DefineConstants Condition="'$(IsLinux)'=='true'">LINUX</DefineConstants>
|
|
<DefineConstants Condition="'$(IsOSX)'=='true' OR '$(IsLinux)'=='true'">UNIX</DefineConstants>
|
|
<DefineConstants Condition="'$(SkipLocalsInitAttribute)'=='true'">NO_LOCAL_INIT</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(RuntimeIdentifier)'==''">
|
|
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
|
|
<SelfContained>false</SelfContained>
|
|
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
|
<InvariantGlobalization>true</InvariantGlobalization>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(IsWindows)'=='true' AND '$(RuntimeIdentifier)'==''">
|
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(IsOSX)'=='true' AND '$(RuntimeIdentifier)'==''">
|
|
<RuntimeIdentifier>osx-x64</RuntimeIdentifier>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
|
|
<DefineConstants>TRACE;DEBUG</DefineConstants>
|
|
<Optimize>false</Optimize>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Configuration)'=='Release'">
|
|
<Optimize>true</Optimize>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Configuration)'=='Analyze'">
|
|
<EnableNETAnalyzers>true</EnableNETAnalyzers>
|
|
<CodeAnalysisRuleSet>..\..\Rules.ruleset</CodeAnalysisRuleSet>
|
|
<AnalysisLevel>latest</AnalysisLevel>
|
|
</PropertyGroup>
|
|
<ItemGroup>
|
|
<PackageReference Include="Nerdbank.GitVersioning" Version="3.4.165-alpha">
|
|
<PrivateAssets>all</PrivateAssets>
|
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
</PackageReference>
|
|
<AdditionalFiles Include=".\Rules.ruleset" />
|
|
</ItemGroup>
|
|
</Project>
|