2015-07-07 4 views
1

У меня есть этот ниже фрагмент кода, который я всегда выделял SONAR как ОСНОВНАЯ проблема из-за нарушения правила, вызванного сообщением ниже.Что такое SONAR Error AvoidRepetitiveCallsToPropertiesRule означает?

Несколько (3) вызывает виртуальную собственность 'System.String System.Reflection.MemberInfo :: get_Name()'.

И описание правила говорит

AvoidRepetitiveCallsToPropertiesRule
жандарм: AvoidRepetitiveCallsToPropertiesRule Правило предупредит, если виртуальные, или вряд ли будет рядным состояние, добытчики свойства называют несколько раз методом. В большинстве случаев повторные вызовы просто требуют больше времени без каких-либо выигрышей, так как результат всегда будет идентичным. Вы должны игнорировать сообщенные дефекты, если другое значение, как ожидается, каждый раз, когда свойство называется (например, вызывая 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 жалуется на линии prop.Name который у меня внутри петли foreach? Как я могу избежать этого?

+1

В цикле установите временную переменную 'string propName = prop.Name;' и используйте ее везде, где у вас есть 'prop.Name' внутри цикла. Повторите для каждого цикла. –

+0

@ron beyer ... Как это решить проблему? Значение Prop.Name изменяется для каждой итерации в цикле, купите присвоение prop.name локальной переменной, думаете ли вы, что мы избегаем нескольких вызовов? – CSharped

+0

Так как СОНАР жалуется, повторные вызовы 'prop.Name', сохраняя его во временной переменной, удаляют повторяющиеся вызовы свойства. Поскольку вы не ожидаете изменения значения свойства, SONAR сообщает вам, что вы должны кэшировать значение, а не повторять его повторно. Преимущества производительности незначительны, и я бы рискнул сказать, что звонки действительно не стоят так много, но если вы хотите соблюдать правило, вот как это исправить. –

ответ

0

Ron Beyer комментарии являются правильными ответами на этот вопрос.

Итак, ваш код будет выглядеть следующим образом на основе его комментария:

... 
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.