【发布时间】: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