From 14589b12abdfa1727f14f5d61ac5c682d4504c0a Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Tue, 26 Jan 2021 15:35:37 -0500 Subject: [PATCH] Remove lots of boxing from EnvironmentVariablesConfigurationProvider.Load (#47453) --- ...vironmentVariablesConfigurationProvider.cs | 91 ++++++++++--------- 1 file changed, 50 insertions(+), 41 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Configuration.EnvironmentVariables/src/EnvironmentVariablesConfigurationProvider.cs b/src/libraries/Microsoft.Extensions.Configuration.EnvironmentVariables/src/EnvironmentVariablesConfigurationProvider.cs index 46fa51b60e9c4f..294956a5e737ee 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.EnvironmentVariables/src/EnvironmentVariablesConfigurationProvider.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.EnvironmentVariables/src/EnvironmentVariablesConfigurationProvider.cs @@ -42,53 +42,62 @@ internal void Load(IDictionary envVariables) { var data = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (DictionaryEntry entry in envVariables) + IDictionaryEnumerator e = envVariables.GetEnumerator(); + try { - string key = (string)entry.Key; - string provider = null; - string prefix; - - if (key.StartsWith(MySqlServerPrefix, StringComparison.OrdinalIgnoreCase)) - { - prefix = MySqlServerPrefix; - provider = "MySql.Data.MySqlClient"; - } - else if (key.StartsWith(SqlAzureServerPrefix, StringComparison.OrdinalIgnoreCase)) - { - prefix = SqlAzureServerPrefix; - provider = "System.Data.SqlClient"; - } - else if (key.StartsWith(SqlServerPrefix, StringComparison.OrdinalIgnoreCase)) - { - prefix = SqlServerPrefix; - provider = "System.Data.SqlClient"; - } - else if (key.StartsWith(CustomPrefix, StringComparison.OrdinalIgnoreCase)) - { - prefix = CustomPrefix; - } - else if (key.StartsWith(_prefix, StringComparison.OrdinalIgnoreCase)) + while (e.MoveNext()) { - // This prevents the prefix from being normalized. - // We can also do a fast path branch, I guess? No point in reallocating if the prefix is empty. - key = NormalizeKey(key.Substring(_prefix.Length)); - data[key] = entry.Value as string; + DictionaryEntry entry = e.Entry; + string key = (string)entry.Key; + string provider = null; + string prefix; - continue; - } - else - { - continue; - } + if (key.StartsWith(MySqlServerPrefix, StringComparison.OrdinalIgnoreCase)) + { + prefix = MySqlServerPrefix; + provider = "MySql.Data.MySqlClient"; + } + else if (key.StartsWith(SqlAzureServerPrefix, StringComparison.OrdinalIgnoreCase)) + { + prefix = SqlAzureServerPrefix; + provider = "System.Data.SqlClient"; + } + else if (key.StartsWith(SqlServerPrefix, StringComparison.OrdinalIgnoreCase)) + { + prefix = SqlServerPrefix; + provider = "System.Data.SqlClient"; + } + else if (key.StartsWith(CustomPrefix, StringComparison.OrdinalIgnoreCase)) + { + prefix = CustomPrefix; + } + else if (key.StartsWith(_prefix, StringComparison.OrdinalIgnoreCase)) + { + // This prevents the prefix from being normalized. + // We can also do a fast path branch, I guess? No point in reallocating if the prefix is empty. + key = NormalizeKey(key.Substring(_prefix.Length)); + data[key] = entry.Value as string; - // Add the key-value pair for connection string, and optionally provider name - key = NormalizeKey(key.Substring(prefix.Length)); - AddIfPrefixed(data, $"ConnectionStrings:{key}", (string)entry.Value); - if (provider != null) - { - AddIfPrefixed(data, $"ConnectionStrings:{key}_ProviderName", provider); + continue; + } + else + { + continue; + } + + // Add the key-value pair for connection string, and optionally provider name + key = NormalizeKey(key.Substring(prefix.Length)); + AddIfPrefixed(data, $"ConnectionStrings:{key}", (string)entry.Value); + if (provider != null) + { + AddIfPrefixed(data, $"ConnectionStrings:{key}_ProviderName", provider); + } } } + finally + { + (e as IDisposable)?.Dispose(); + } Data = data; }