From e2d3afc879746eab4f3ee4de34f9c987ab9b5c7e Mon Sep 17 00:00:00 2001 From: Youssef Victor Date: Sun, 7 Jul 2024 08:06:30 +0300 Subject: [PATCH] perf: Avoid OfTypeIterator allocations --- src/Uno.UI/UI/Xaml/VisualStateGroup.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Uno.UI/UI/Xaml/VisualStateGroup.cs b/src/Uno.UI/UI/Xaml/VisualStateGroup.cs index 210590b93d28..cc99f2065da9 100644 --- a/src/Uno.UI/UI/Xaml/VisualStateGroup.cs +++ b/src/Uno.UI/UI/Xaml/VisualStateGroup.cs @@ -348,11 +348,14 @@ void ApplyTargetStateSetters() // This block is a manual enumeration to avoid the foreach pattern // See https://github.com/dotnet/runtime/issues/56309 for details - var settersEnumerator = target.setters.OfType().GetEnumerator(); + var settersEnumerator = target.setters.GetEnumerator(); while (settersEnumerator.MoveNext()) { - settersEnumerator.Current.ApplyValue(element); + if (settersEnumerator.Current is Setter setter) + { + setter.ApplyValue(element); + } } } finally @@ -407,9 +410,12 @@ private static void ClearPropertiesNotSetInNextState( if (nextSetters is { }) { - foreach (var setter in nextSetters.OfType()) + foreach (var setterBase in nextSetters) { - propertiesNotToClear[propsLength++] = setter.TryGetOrCreateBindingPath(element); + if (setterBase is Setter setter) + { + propertiesNotToClear[propsLength++] = setter.TryGetOrCreateBindingPath(element); + } } } @@ -423,10 +429,11 @@ private static void ClearPropertiesNotSetInNextState( if (prevSetters is { }) { - foreach (var setter in prevSetters.OfType()) + foreach (var setterBase in prevSetters) { // Setters with a null path are always cleared. - if (setter.TryGetOrCreateBindingPath(element) is not { } prevPath || !propertiesNotToClear.Any(path => prevPath.PrefixOfOrEqualTo(path))) + if (setterBase is Setter setter && + (setter.TryGetOrCreateBindingPath(element) is not { } prevPath || !propertiesNotToClear.Any(path => prevPath.PrefixOfOrEqualTo(path)))) { setter.ClearValue(); }