diff --git a/src/Avalonia.Base/Utilities/ThrowHelper.cs b/src/Avalonia.Base/Utilities/ThrowHelper.cs
new file mode 100644
index 0000000000..e97ab754e5
--- /dev/null
+++ b/src/Avalonia.Base/Utilities/ThrowHelper.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Runtime.CompilerServices;
+
+namespace Avalonia.Utilities;
+
+///
+/// Helper method to help inlining methods that do a throw check.
+/// Equivalent of .NET6+ ArgumentNullException.ThrowIfNull() for netstandard2.0+
+///
+internal class ThrowHelper
+{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static void ThrowIfNull([NotNull] object? argument, string paramName)
+ {
+ if (argument is null)
+ {
+ ThrowArgumentNullException(paramName);
+ }
+ }
+
+ [DoesNotReturn]
+ private static void ThrowArgumentNullException(string paramName) => throw new ArgumentNullException(paramName);
+}
diff --git a/src/Avalonia.Base/VisualTree/VisualExtensions.cs b/src/Avalonia.Base/VisualTree/VisualExtensions.cs
index b3cdd70fa0..e244323ed9 100644
--- a/src/Avalonia.Base/VisualTree/VisualExtensions.cs
+++ b/src/Avalonia.Base/VisualTree/VisualExtensions.cs
@@ -1,7 +1,10 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
+using System.Runtime.CompilerServices;
using Avalonia.Rendering;
+using Avalonia.Utilities;
namespace Avalonia.VisualTree
{
@@ -125,9 +128,9 @@ namespace Avalonia.VisualTree
/// The visual's ancestors.
public static IEnumerable GetVisualAncestors(this Visual visual)
{
- Visual? v = visual ?? throw new ArgumentNullException(nameof(visual));
+ ThrowHelper.ThrowIfNull(visual, nameof(visual));
- v = v.VisualParent;
+ var v = visual.VisualParent;
while (v != null)
{
@@ -194,7 +197,7 @@ namespace Avalonia.VisualTree
/// The visual and its ancestors.
public static IEnumerable GetSelfAndVisualAncestors(this Visual visual)
{
- _ = visual ?? throw new ArgumentNullException(nameof(visual));
+ ThrowHelper.ThrowIfNull(visual, nameof(visual));
yield return visual;
@@ -275,7 +278,7 @@ namespace Avalonia.VisualTree
/// The visual at the requested point.
public static Visual? GetVisualAt(this Visual visual, Point p)
{
- _ = visual ?? throw new ArgumentNullException(nameof(visual));
+ ThrowHelper.ThrowIfNull(visual, nameof(visual));
return visual.GetVisualAt(p, x => x.IsVisible);
}
@@ -292,7 +295,7 @@ namespace Avalonia.VisualTree
/// The visual at the requested point.
public static Visual? GetVisualAt(this Visual visual, Point p, Func filter)
{
- _ = visual ?? throw new ArgumentNullException(nameof(visual));
+ ThrowHelper.ThrowIfNull(visual, nameof(visual));
var root = visual.GetVisualRoot();
@@ -321,7 +324,7 @@ namespace Avalonia.VisualTree
this Visual visual,
Point p)
{
- _ = visual ?? throw new ArgumentNullException(nameof(visual));
+ ThrowHelper.ThrowIfNull(visual, nameof(visual));
return visual.GetVisualsAt(p, x => x.IsVisible);
}
@@ -341,7 +344,7 @@ namespace Avalonia.VisualTree
Point p,
Func filter)
{
- _ = visual ?? throw new ArgumentNullException(nameof(visual));
+ ThrowHelper.ThrowIfNull(visual, nameof(visual));
var root = visual.GetVisualRoot();
@@ -435,7 +438,7 @@ namespace Avalonia.VisualTree
///
public static IRenderRoot? GetVisualRoot(this Visual visual)
{
- _ = visual ?? throw new ArgumentNullException(nameof(visual));
+ ThrowHelper.ThrowIfNull(visual, nameof(visual));
return visual as IRenderRoot ?? visual.VisualRoot;
}