diff --git a/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.csproj b/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.csproj
index 2755e1d1cf69..7b9e941610fe 100644
--- a/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.csproj
+++ b/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.csproj
@@ -3,6 +3,7 @@
netstandard2.0;$(DefaultNetCoreTargetFramework)
$(DefaultNetCoreTargetFramework)
+ annotations
diff --git a/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.netcoreapp.cs b/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.netcoreapp.cs
index b3b72bec86e3..ff431bda1438 100644
--- a/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.netcoreapp.cs
+++ b/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.netcoreapp.cs
@@ -22,7 +22,7 @@ public DefaultPooledObjectPolicy() { }
public override T Create() { throw null; }
public override bool Return(T obj) { throw null; }
}
- public partial interface IPooledObjectPolicy
+ public partial interface IPooledObjectPolicy where T : notnull
{
T Create();
bool Return(T obj);
@@ -40,7 +40,7 @@ public override void Return(T obj) { }
}
public static partial class ObjectPool
{
- public static Microsoft.Extensions.ObjectPool.ObjectPool Create(Microsoft.Extensions.ObjectPool.IPooledObjectPolicy policy = null) where T : class, new() { throw null; }
+ public static Microsoft.Extensions.ObjectPool.ObjectPool Create(Microsoft.Extensions.ObjectPool.IPooledObjectPolicy? policy = null) where T : class, new() { throw null; }
}
public abstract partial class ObjectPoolProvider
{
@@ -59,7 +59,7 @@ protected ObjectPool() { }
public abstract T Get();
public abstract void Return(T obj);
}
- public abstract partial class PooledObjectPolicy : Microsoft.Extensions.ObjectPool.IPooledObjectPolicy
+ public abstract partial class PooledObjectPolicy : Microsoft.Extensions.ObjectPool.IPooledObjectPolicy where T : notnull
{
protected PooledObjectPolicy() { }
public abstract T Create();
diff --git a/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.netstandard2.0.cs b/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.netstandard2.0.cs
index b3b72bec86e3..ff431bda1438 100644
--- a/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.netstandard2.0.cs
+++ b/src/ObjectPool/ref/Microsoft.Extensions.ObjectPool.netstandard2.0.cs
@@ -22,7 +22,7 @@ public DefaultPooledObjectPolicy() { }
public override T Create() { throw null; }
public override bool Return(T obj) { throw null; }
}
- public partial interface IPooledObjectPolicy
+ public partial interface IPooledObjectPolicy where T : notnull
{
T Create();
bool Return(T obj);
@@ -40,7 +40,7 @@ public override void Return(T obj) { }
}
public static partial class ObjectPool
{
- public static Microsoft.Extensions.ObjectPool.ObjectPool Create(Microsoft.Extensions.ObjectPool.IPooledObjectPolicy policy = null) where T : class, new() { throw null; }
+ public static Microsoft.Extensions.ObjectPool.ObjectPool Create(Microsoft.Extensions.ObjectPool.IPooledObjectPolicy? policy = null) where T : class, new() { throw null; }
}
public abstract partial class ObjectPoolProvider
{
@@ -59,7 +59,7 @@ protected ObjectPool() { }
public abstract T Get();
public abstract void Return(T obj);
}
- public abstract partial class PooledObjectPolicy : Microsoft.Extensions.ObjectPool.IPooledObjectPolicy
+ public abstract partial class PooledObjectPolicy : Microsoft.Extensions.ObjectPool.IPooledObjectPolicy where T : notnull
{
protected PooledObjectPolicy() { }
public abstract T Create();
diff --git a/src/ObjectPool/src/DefaultObjectPool.cs b/src/ObjectPool/src/DefaultObjectPool.cs
index f5627b7898bb..be514c0e633f 100644
--- a/src/ObjectPool/src/DefaultObjectPool.cs
+++ b/src/ObjectPool/src/DefaultObjectPool.cs
@@ -1,8 +1,9 @@
-// Copyright (c) .NET Foundation. All rights reserved.
+// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using System.Threading;
@@ -18,10 +19,10 @@ public class DefaultObjectPool : ObjectPool where T : class
private protected readonly ObjectWrapper[] _items;
private protected readonly IPooledObjectPolicy _policy;
private protected readonly bool _isDefaultPolicy;
- private protected T _firstItem;
+ private protected T? _firstItem;
// This class was introduced in 2.1 to avoid the interface call where possible
- private protected readonly PooledObjectPolicy _fastPolicy;
+ private protected readonly PooledObjectPolicy? _fastPolicy;
///
/// Creates an instance of .
@@ -97,7 +98,7 @@ public override void Return(T obj)
[DebuggerDisplay("{Element}")]
private protected struct ObjectWrapper
{
- public T Element;
+ public T? Element;
}
}
}
diff --git a/src/ObjectPool/src/DisposableObjectPool.cs b/src/ObjectPool/src/DisposableObjectPool.cs
index 17ada443e508..e0e1a5cef563 100644
--- a/src/ObjectPool/src/DisposableObjectPool.cs
+++ b/src/ObjectPool/src/DisposableObjectPool.cs
@@ -1,8 +1,7 @@
-// Copyright (c) .NET Foundation. All rights reserved.
+// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
-using System.Runtime.CompilerServices;
using System.Threading;
namespace Microsoft.Extensions.ObjectPool
@@ -82,7 +81,7 @@ public void Dispose()
}
}
- private void DisposeItem(T item)
+ private void DisposeItem(T? item)
{
if (item is IDisposable disposable)
{
diff --git a/src/ObjectPool/src/IPooledObjectPolicy.cs b/src/ObjectPool/src/IPooledObjectPolicy.cs
index 458131e8247f..998d146ada8a 100644
--- a/src/ObjectPool/src/IPooledObjectPolicy.cs
+++ b/src/ObjectPool/src/IPooledObjectPolicy.cs
@@ -7,7 +7,7 @@ namespace Microsoft.Extensions.ObjectPool
/// Represents a policy for managing pooled objects.
///
/// The type of object which is being pooled.
- public interface IPooledObjectPolicy
+ public interface IPooledObjectPolicy where T : notnull
{
///
/// Create a .
diff --git a/src/ObjectPool/src/LeakTrackingObjectPool.cs b/src/ObjectPool/src/LeakTrackingObjectPool.cs
index 243d44d2daca..4bae02babc93 100644
--- a/src/ObjectPool/src/LeakTrackingObjectPool.cs
+++ b/src/ObjectPool/src/LeakTrackingObjectPool.cs
@@ -1,4 +1,4 @@
-// Copyright (c) .NET Foundation. All rights reserved.
+// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
@@ -31,8 +31,7 @@ public override T Get()
public override void Return(T obj)
{
- Tracker tracker;
- if (_trackers.TryGetValue(obj, out tracker))
+ if (_trackers.TryGetValue(obj, out var tracker))
{
_trackers.Remove(obj);
tracker.Dispose();
diff --git a/src/ObjectPool/src/Microsoft.Extensions.ObjectPool.csproj b/src/ObjectPool/src/Microsoft.Extensions.ObjectPool.csproj
index b2cc5954ce25..1e5d45e9e0f8 100644
--- a/src/ObjectPool/src/Microsoft.Extensions.ObjectPool.csproj
+++ b/src/ObjectPool/src/Microsoft.Extensions.ObjectPool.csproj
@@ -8,6 +8,7 @@
pooling
true
true
+ enable
diff --git a/src/ObjectPool/src/ObjectPool.cs b/src/ObjectPool/src/ObjectPool.cs
index 0a82ed6f5392..306629147c60 100644
--- a/src/ObjectPool/src/ObjectPool.cs
+++ b/src/ObjectPool/src/ObjectPool.cs
@@ -1,6 +1,8 @@
-// Copyright (c) .NET Foundation. All rights reserved.
+// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+using System.Diagnostics.CodeAnalysis;
+
namespace Microsoft.Extensions.ObjectPool
{
///
@@ -28,7 +30,7 @@ public abstract class ObjectPool where T : class
public static class ObjectPool
{
///
- public static ObjectPool Create(IPooledObjectPolicy policy = null) where T : class, new()
+ public static ObjectPool Create(IPooledObjectPolicy? policy = null) where T : class, new()
{
var provider = new DefaultObjectPoolProvider();
return provider.Create(policy ?? new DefaultPooledObjectPolicy());
diff --git a/src/ObjectPool/src/PooledObjectPolicy.cs b/src/ObjectPool/src/PooledObjectPolicy.cs
index 855b76496778..c1dbd72d0c1d 100644
--- a/src/ObjectPool/src/PooledObjectPolicy.cs
+++ b/src/ObjectPool/src/PooledObjectPolicy.cs
@@ -3,7 +3,7 @@
namespace Microsoft.Extensions.ObjectPool
{
- public abstract class PooledObjectPolicy : IPooledObjectPolicy
+ public abstract class PooledObjectPolicy : IPooledObjectPolicy where T : notnull
{
public abstract T Create();
diff --git a/src/ObjectPool/test/Microsoft.Extensions.ObjectPool.Tests.csproj b/src/ObjectPool/test/Microsoft.Extensions.ObjectPool.Tests.csproj
index cc308fa8a009..bef91a57ebc7 100644
--- a/src/ObjectPool/test/Microsoft.Extensions.ObjectPool.Tests.csproj
+++ b/src/ObjectPool/test/Microsoft.Extensions.ObjectPool.Tests.csproj
@@ -2,6 +2,7 @@
$(DefaultNetCoreTargetFramework);net472
+ enable
diff --git a/src/ObjectPool/test/ThreadingTest.cs b/src/ObjectPool/test/ThreadingTest.cs
index dbab7a530133..c106ef6550fd 100644
--- a/src/ObjectPool/test/ThreadingTest.cs
+++ b/src/ObjectPool/test/ThreadingTest.cs
@@ -1,4 +1,4 @@
-// Copyright (c) .NET Foundation. All rights reserved.
+// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading;
@@ -8,8 +8,8 @@ namespace Microsoft.Extensions.ObjectPool
{
public class ThreadingTest
{
- private CancellationTokenSource _cts;
- private DefaultObjectPool- _pool;
+ private CancellationTokenSource _cts = default!;
+ private DefaultObjectPool
- _pool = default!;
private bool _foundError;
[Fact]