diff --git a/src/System.Management.Automation/engine/Modules/ModuleSpecification.cs b/src/System.Management.Automation/engine/Modules/ModuleSpecification.cs index 7e854fa9dfe..775b14a555e 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleSpecification.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleSpecification.cs @@ -45,7 +45,7 @@ public ModuleSpecification(string moduleName) { if (string.IsNullOrEmpty(moduleName)) { - throw new ArgumentNullException("moduleName"); + throw new ArgumentNullException(nameof(moduleName)); } this.Name = moduleName; // Alias name of miniumVersion @@ -67,7 +67,7 @@ public ModuleSpecification(Hashtable moduleSpecification) { if (moduleSpecification == null) { - throw new ArgumentNullException("moduleSpecification"); + throw new ArgumentNullException(nameof(moduleSpecification)); } var exception = ModuleSpecificationInitHelper(this, moduleSpecification); @@ -91,31 +91,35 @@ internal static Exception ModuleSpecificationInitHelper(ModuleSpecification modu { foreach (DictionaryEntry entry in hashtable) { - if (entry.Key.ToString().Equals("ModuleName", StringComparison.OrdinalIgnoreCase)) + string field = entry.Key.ToString(); + + if (field.Equals("ModuleName", StringComparison.OrdinalIgnoreCase)) { moduleSpecification.Name = LanguagePrimitives.ConvertTo(entry.Value); } - else if (entry.Key.ToString().Equals("ModuleVersion", StringComparison.OrdinalIgnoreCase)) + else if (field.Equals("ModuleVersion", StringComparison.OrdinalIgnoreCase)) { moduleSpecification.Version = LanguagePrimitives.ConvertTo(entry.Value); } - else if (entry.Key.ToString().Equals("RequiredVersion", StringComparison.OrdinalIgnoreCase)) + else if (field.Equals("RequiredVersion", StringComparison.OrdinalIgnoreCase)) { moduleSpecification.RequiredVersion = LanguagePrimitives.ConvertTo(entry.Value); } - else if (entry.Key.ToString().Equals("MaximumVersion", StringComparison.OrdinalIgnoreCase)) + else if (field.Equals("MaximumVersion", StringComparison.OrdinalIgnoreCase)) { moduleSpecification.MaximumVersion = LanguagePrimitives.ConvertTo(entry.Value); ModuleCmdletBase.GetMaximumVersion(moduleSpecification.MaximumVersion); } - else if (entry.Key.ToString().Equals("GUID", StringComparison.OrdinalIgnoreCase)) + else if (field.Equals("GUID", StringComparison.OrdinalIgnoreCase)) { moduleSpecification.Guid = LanguagePrimitives.ConvertTo(entry.Value); } else { if (badKeys.Length > 0) + { badKeys.Append(", "); + } badKeys.Append("'"); badKeys.Append(entry.Key.ToString()); badKeys.Append("'"); @@ -166,7 +170,7 @@ internal ModuleSpecification(PSModuleInfo moduleInfo) { if (moduleInfo == null) { - throw new ArgumentNullException("moduleInfo"); + throw new ArgumentNullException(nameof(moduleInfo)); } this.Name = moduleInfo.Name; @@ -182,36 +186,39 @@ internal ModuleSpecification(PSModuleInfo moduleInfo) /// public override string ToString() { - string moduleSpecString = string.Empty; if (Guid == null && Version == null && RequiredVersion == null && MaximumVersion == null) { - moduleSpecString = Name; + return Name; + } + + var moduleSpecBuilder = new StringBuilder(); + + moduleSpecBuilder.Append("@{ ModuleName = '").Append(Name).Append("'"); + + if (Guid != null) + { + moduleSpecBuilder.Append("; Guid = '{").Append(Guid).Append("}' "); + } + + if (RequiredVersion != null) + { + moduleSpecBuilder.Append("; RequiredVersion = '").Append(RequiredVersion).Append("'"); } else { - moduleSpecString = "@{ ModuleName = '" + Name + "'"; - if (Guid != null) - { - moduleSpecString += "; Guid = '{" + Guid + "}' "; - } - if (RequiredVersion != null) + if (Version != null) { - moduleSpecString += "; RequiredVersion = '" + RequiredVersion + "'"; + moduleSpecBuilder.Append("; ModuleVersion = '").Append(Version).Append("'"); } - else + if (MaximumVersion != null) { - if (Version != null) - { - moduleSpecString += "; ModuleVersion = '" + Version + "'"; - } - if (MaximumVersion != null) - { - moduleSpecString += "; MaximumVersion = '" + MaximumVersion + "'"; - } + moduleSpecBuilder.Append("; MaximumVersion = '").Append(MaximumVersion).Append("'"); } - moduleSpecString += " }"; } - return moduleSpecString; + + moduleSpecBuilder.Append(" }"); + + return moduleSpecBuilder.ToString(); } /// @@ -266,96 +273,45 @@ public static bool TryParse(string input, out ModuleSpecification result) public Version RequiredVersion { get; internal set; } } + /// + /// Compares two ModuleSpecification objects for equality. + /// internal class ModuleSpecificationComparer : IEqualityComparer { + /// + /// Check if two module specifications are property-wise equal. + /// + /// + /// + /// True if the specifications are equal, false otherwise. public bool Equals(ModuleSpecification x, ModuleSpecification y) { - bool result = false; - - if (x == null && y == null) + if (x == y) { - result = true; - } - else if (x != null && y != null) - { - if (x.Name != null && y.Name != null) - { - result = x.Name.Equals(y.Name, StringComparison.OrdinalIgnoreCase); - } - else - { - result = true; - } - if (result) - { - if (x.Guid.HasValue && y.Guid.HasValue) - { - result = x.Guid.Equals(y.Guid); - } - } - if (result) - { - if (x.Version != null && y.Version != null) - { - result = x.Version.Equals(y.Version); - } - else if (x.Version != null || y.Version != null) - { - result = false; - } - - if (x.MaximumVersion != null && y.MaximumVersion != null) - { - result = x.MaximumVersion.Equals(y.MaximumVersion); - } - else if (x.MaximumVersion != null || y.MaximumVersion != null) - { - result = false; - } - - if (result && x.RequiredVersion != null && y.RequiredVersion != null) - { - result = x.RequiredVersion.Equals(y.RequiredVersion); - } - else if (result && (x.RequiredVersion != null || y.RequiredVersion != null)) - { - result = false; - } - } + return true; } - return result; + return x != null && y != null + && String.Equals(x.Name, y.Name, StringComparison.OrdinalIgnoreCase) + && Guid.Equals(x.Guid, y.Guid) + && Version.Equals(x.RequiredVersion, y.RequiredVersion) + && Version.Equals(x.Version, y.Version) + && String.Equals(x.MaximumVersion, y.MaximumVersion); } + /// + /// Get a property-based hashcode for a ModuleSpecification object. + /// + /// The module specification for the object. + /// A hashcode that is always the same for any module specification with the same properties. public int GetHashCode(ModuleSpecification obj) { - int result = 0; - - if (obj != null) + if (obj == null) { - if (obj.Name != null) - { - result = result ^ obj.Name.GetHashCode(); - } - if (obj.Guid.HasValue) - { - result = result ^ obj.Guid.GetHashCode(); - } - if (obj.Version != null) - { - result = result ^ obj.Version.GetHashCode(); - } - if (obj.MaximumVersion != null) - { - result = result ^ obj.MaximumVersion.GetHashCode(); - } - if (obj.RequiredVersion != null) - { - result = result ^ obj.RequiredVersion.GetHashCode(); - } + return 0; } - return result; + return HashCode.Combine(obj.Name, obj.Guid, obj.RequiredVersion, obj.Version, obj.MaximumVersion); } }