簡體   English   中英

SONAR錯誤躲避ReplicatitiveCallsToPropertiesRule是什么意思?

[英]What does SONAR Error AvoidRepetitiveCallsToPropertiesRule mean?

我有下面這段代碼,由於違反了以下消息所調用的規則,因此我始終將SONAR突出顯示為主要問題。

對虛擬屬性'System.String System.Reflection.MemberInfo :: get_Name()'的多次調用(3)。

規則說明說

AvoidRepetitiveCallsToPropertiesRule
gendarme:避免RepetitiveCallsToPropertiesRule該規則警告如果某個方法多次調用了虛擬的或不太可能是內聯的屬性獲取器。 在大多數情況下,重復通話只是需要更多時間而沒有任何收益,因為結果始終是相同的。 如果每次調用該屬性(例如,調用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行? 我該如何避免呢?

羅恩·拜爾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);
        }
    }
}
...

請注意,在3.0版的C#插件中刪除了對Gendarme規則的支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM