From 03f0126112dceb3a0f42577154451d0611b8bcbf Mon Sep 17 00:00:00 2001 From: h3xds1nz Date: Sat, 10 Aug 2024 10:31:44 +0200 Subject: [PATCH 1/6] convert Hashtable to Dictionary --- .../src/WindowsBase/System/Windows/DependencyProperty.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs index 7139ea33411..25347e7b379 100644 --- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs +++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs @@ -260,7 +260,7 @@ private static DependencyProperty RegisterCommon(string name, Type propertyType, FromNameKey key = new FromNameKey(name, ownerType); lock (Synchronized) { - if (PropertyFromName.Contains(key)) + if (PropertyFromName.ContainsKey(key)) { throw new ArgumentException(SR.Format(SR.PropertyAlreadyRegistered, name, ownerType.Name)); } @@ -765,7 +765,7 @@ public DependencyProperty AddOwner(Type ownerType, PropertyMetadata typeMetadata lock (Synchronized) { - if (PropertyFromName.Contains(key)) + if (PropertyFromName.ContainsKey(key)) { throw new ArgumentException(SR.Format(SR.PropertyAlreadyRegistered, Name, ownerType.Name)); } @@ -991,7 +991,7 @@ internal static DependencyProperty FromName(string name, Type ownerType) lock (Synchronized) { - dp = (DependencyProperty)PropertyFromName[key]; + dp = PropertyFromName[key]; } ownerType = ownerType.BaseType; @@ -1198,7 +1198,7 @@ private enum Flags : int /* property */ internal static ItemStructList RegisteredPropertyList = new ItemStructList(768); // Synchronized: Covered by DependencyProperty.Synchronized - private static Hashtable PropertyFromName = new Hashtable(); + private static readonly Dictionary PropertyFromName = new(); // Synchronized: Covered by DependencyProperty.Synchronized private static int GlobalIndexCount; From 7811d5723a2c149e8c60d1a7752512345f9bcce0 Mon Sep 17 00:00:00 2001 From: h3xds1nz Date: Sat, 10 Aug 2024 10:32:51 +0200 Subject: [PATCH 2/6] convert Synchronized (lock obj) as readonly --- .../src/WindowsBase/System/Windows/DependencyProperty.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs index 25347e7b379..b65052c6bfd 100644 --- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs +++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs @@ -1204,7 +1204,7 @@ private enum Flags : int private static int GlobalIndexCount; // Global, cross-object synchronization - internal static object Synchronized = new object(); + internal static readonly object Synchronized = new object(); // Nullable Type private static Type NullableType = typeof(Nullable<>); From a0a99b12b64ee2729e78030b9fda67dc599a476e Mon Sep 17 00:00:00 2001 From: h3xds1nz Date: Sat, 10 Aug 2024 19:22:43 +0200 Subject: [PATCH 3/6] convert FromNameKey to be a readonly struct instead of a class --- .../System/Windows/DependencyProperty.cs | 39 ++++++------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs index b65052c6bfd..755ae321fe2 100644 --- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs +++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs @@ -257,7 +257,7 @@ private static void RegisterParameterValidation(string name, Type propertyType, private static DependencyProperty RegisterCommon(string name, Type propertyType, Type ownerType, PropertyMetadata defaultMetadata, ValidateValueCallback validateValueCallback) { - FromNameKey key = new FromNameKey(name, ownerType); + FromNameKey key = new(name, ownerType); lock (Synchronized) { if (PropertyFromName.ContainsKey(key)) @@ -761,7 +761,7 @@ public DependencyProperty AddOwner(Type ownerType, PropertyMetadata typeMetadata // Map owner type to this property // Build key - FromNameKey key = new FromNameKey(Name, ownerType); + FromNameKey key = new(Name, ownerType); lock (Synchronized) { @@ -776,13 +776,11 @@ public DependencyProperty AddOwner(Type ownerType, PropertyMetadata typeMetadata OverrideMetadata(ownerType, typeMetadata); } - lock (Synchronized) { PropertyFromName[key] = this; } - return this; } @@ -979,7 +977,7 @@ internal static DependencyProperty FromName(string name, Type ownerType) ArgumentNullException.ThrowIfNull(name); ArgumentNullException.ThrowIfNull(ownerType); - FromNameKey key = new FromNameKey(name, ownerType); + FromNameKey key; while ((dp == null) && (ownerType != null)) { @@ -987,11 +985,12 @@ internal static DependencyProperty FromName(string name, Type ownerType) MS.Internal.WindowsBase.SecurityHelper.RunClassConstructor(ownerType); // Locate property - key.UpdateNameKey(ownerType); + key = new FromNameKey(name, ownerType); lock (Synchronized) { - dp = PropertyFromName[key]; + if (PropertyFromName.TryGetValue(key, out dp)) + return dp; } ownerType = ownerType.BaseType; @@ -1033,7 +1032,7 @@ internal static bool IsValidType(object value, Type propertyType) return true; } - private class FromNameKey + private readonly struct FromNameKey : IEquatable { public FromNameKey(string name, Type ownerType) { @@ -1043,13 +1042,6 @@ public FromNameKey(string name, Type ownerType) _hashCode = _name.GetHashCode() ^ _ownerType.GetHashCode(); } - public void UpdateNameKey(Type ownerType) - { - _ownerType = ownerType; - - _hashCode = _name.GetHashCode() ^ _ownerType.GetHashCode(); - } - public override int GetHashCode() { return _hashCode; @@ -1057,25 +1049,18 @@ public override int GetHashCode() public override bool Equals(object o) { - if ((o != null) && (o is FromNameKey)) - { - return Equals((FromNameKey)o); - } - else - { - return false; - } + return o is FromNameKey key && Equals(key); } public bool Equals(FromNameKey key) { - return (_name.Equals(key._name) && (_ownerType == key._ownerType)); + return _name.Equals(key._name) && _ownerType == key._ownerType; } - private string _name; - private Type _ownerType; + private readonly string _name; + private readonly Type _ownerType; - private int _hashCode; + private readonly int _hashCode; } From c78a252cce30a7788fd329c2556665fd40e69956 Mon Sep 17 00:00:00 2001 From: h3xds1nz Date: Sat, 10 Aug 2024 19:23:22 +0200 Subject: [PATCH 4/6] conver Synchronized to be a Lock instead of a simple object --- .../src/WindowsBase/System/Windows/DependencyProperty.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs index 755ae321fe2..1c66dee0699 100644 --- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs +++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs @@ -1189,7 +1189,7 @@ private enum Flags : int private static int GlobalIndexCount; // Global, cross-object synchronization - internal static readonly object Synchronized = new object(); + internal static readonly Lock Synchronized = new(); // Nullable Type private static Type NullableType = typeof(Nullable<>); From 5fded62a09ac02afc3f3b9af5f6579a90420269c Mon Sep 17 00:00:00 2001 From: h3xds1nz Date: Sat, 10 Aug 2024 19:29:11 +0200 Subject: [PATCH 5/6] beautify FromNameKey declaration in FromName --- .../src/WindowsBase/System/Windows/DependencyProperty.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs index 1c66dee0699..f9cd6c9798b 100644 --- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs +++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs @@ -977,16 +977,13 @@ internal static DependencyProperty FromName(string name, Type ownerType) ArgumentNullException.ThrowIfNull(name); ArgumentNullException.ThrowIfNull(ownerType); - FromNameKey key; - while ((dp == null) && (ownerType != null)) { // Ensure static constructor of type has run - MS.Internal.WindowsBase.SecurityHelper.RunClassConstructor(ownerType); + SecurityHelper.RunClassConstructor(ownerType); // Locate property - key = new FromNameKey(name, ownerType); - + FromNameKey key = new(name, ownerType); lock (Synchronized) { if (PropertyFromName.TryGetValue(key, out dp)) From cb5ec160a8068b6af75ee6f8fb2d84fa9425a44b Mon Sep 17 00:00:00 2001 From: h3xds1nz Date: Mon, 9 Sep 2024 13:54:43 +0200 Subject: [PATCH 6/6] Remove check that we've rendered obsolete --- .../src/WindowsBase/System/Windows/DependencyProperty.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs index f9cd6c9798b..54e59632563 100644 --- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs +++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyProperty.cs @@ -977,7 +977,7 @@ internal static DependencyProperty FromName(string name, Type ownerType) ArgumentNullException.ThrowIfNull(name); ArgumentNullException.ThrowIfNull(ownerType); - while ((dp == null) && (ownerType != null)) + while (ownerType != null) { // Ensure static constructor of type has run SecurityHelper.RunClassConstructor(ownerType);