【问题标题】:What does SONAR Error AvoidRepetitiveCallsToPropertiesRule mean?SONAR Error AvoidRepetitiveCallsToPropertiesRule 是什么意思?
【发布时间】:2015-09-25 07:57:01
【问题描述】:

我有这段代码,我总是被 SONAR 强调为一个主要问题,因为它违反了使用以下消息调用的规则。

多次 (3) 调用虚拟属性“System.String System.Reflection.MemberInfo::get_Name()”。

规则描述说

避免RepetitiveCallsToPropertiesRule
宪兵:AvoidRepetitiveCallsToPropertiesRule 如果一个方法多次调用虚拟的或不太可能内联的属性 getter,则该规则会发出警告。在大多数情况下,重复调用只是需要更多时间而没有任何收益,因为结果总是相同的。如果每次调用属性时都需要不同的值(例如调用 DateTime.Now),则应忽略报告的缺陷。**

private static void OverrideConfigurationValues(ConfigA configa,
            ConfigB configb, ConfigC configc) 
        {
            Type t = configa();

            var properties = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
            var overriddenvalues = new Dictionary<string, object>();
            foreach (var prop in properties)
            {
                var value = prop.GetValue(configa,null);

                if (value != null)
                {
                    overriddenvalues.Add(prop.Name, value);
                }
            }

            Type b  = configb.GetType();
            foreach (var prop in b.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (!overriddenvalues.ContainsKey(prop.Name))
                {
                    var value = prop.GetValue(b,null);
                    if (value != null)
                    {

                        overriddenvalues.Add(prop.Name, value);
                    }
                }
            }

            foreach (var overriddenvalue in overriddenvalues)
            {
                var overriden = overriddenvalue;

                foreach (var prop in configa.GetType().GetProperties().Where(prop => prop.Name == overriden.Key))
                {
                    prop.SetValue(configa, overriddenvalue.Value,null);
                }
            }
        }

如果 SONAR 抱怨我在 foreach 循环中的 prop.Name 行?我怎样才能避免它?

【问题讨论】:

  • 在循环中,设置一个临时变量string propName = prop.Name;,然后在循环内有prop.Name 的任何地方使用它。重复每个循环。
  • @ron beyer... 这如何解决问题? Prop.Name 的值随着循环中的每次迭代而变化,购买将 prop.name 分配给局部变量你认为我们避免了多次调用吗?
  • 因为这就是 SONAR 所抱怨的,重复调用 prop.Name,将其存储在临时变量中会删除对属性的重复调用。由于您不希望属性值发生变化,因此 SONAR 告诉您应该缓存该值而不是重复调用它。性能优势可以忽略不计,我敢说调用确实不会花费那么多,但如果你想遵守规则,那就是如何解决它。

标签: c# .net reflection sonarqube sonarlint


【解决方案1】:

Ron Beyer 的 cmets 是这个问题的正确答案。

因此,根据他的 cmets,您的代码将如下所示:

...
foreach (var prop in b.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
    var propName = prop.Name;
    if (!overriddenvalues.ContainsKey(propName))
    {
        var value = prop.GetValue(b,null);
        if (value != null)
        {
            overriddenvalues.Add(propName, value);
        }
    }
}
...

请注意,对宪兵规则的支持在 C# 插件的 3.0 版本中被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多