繁体   English   中英

VS2010代码分析和CA1800:Microsoft性能

[英]VS2010 Code Analysis and CA1800 : Microsoft Performance

我有下面的代码,我知道这不是最佳的。 我运行了代码分析,它给了我警告

CA1800 : Microsoft.Performance : 'customField', a variable, is cast to type 'DateCustomFieldRef' multiple times in method 'Customer.CustomerToUpdat(SearchResult)'. Cache the result of the 'as' operator or direct cast in order to eliminate the redundant castclass instruction. 

我真的不知道该怎么办。

CustomFieldRef[] customFields = customer.customFieldList;
for (int f = 3; f < customFields.Length; f++)
{
    CustomFieldRef customField = customFields[f];
    if (customField is DateCustomFieldRef)
        {
            DateCustomFieldRef dateField = (DateCustomFieldRef)customField;
                if (dateField.internalId != null && dateField.internalId == "created_date")
                    {
                            createdDate = dateField.value.ToString();
                        }
                }
                if (customField is StringCustomFieldRef)
                {
                    StringCustomFieldRef tradingNameField = (StringCustomFieldRef)customField;
                        if (businessNameField.internalId != null && businessNameField.internalId == "business_name")
                        {
                            businessName = businessNameField.value;
                    }
                }
        }
}

有人可以给我一个代码示例或进一步解释它的真正含义吗?

提前致谢。

问题出在如下代码中:

if (customField is DateCustomFieldRef)
{
  DateCustomFieldRef dateField = (DateCustomFieldRef)customField;

这些是多个演员表。

更好:

DateCustomFieldRef fieldasDate = customField as DateCustomFieldFRef

if (fieldasDate != null)
{
  blablabla using fieldasdate

这避免了多次强制转换。

这意味着您多次(可能很昂贵) customField变量,并且最好只转换一次。

您可以使用as运算符来实现这一点,因为as运算符执行转换并返回所需类型的实例,如果无法将对象转换为所需类型,则返回NULL。

像这样:

DateCustomFieldRef customField = customFields[f] as DateCustomFieldRef; // the as operator returns null if the casting did not succeed (that is, customFields[f] is not a DatecustomFieldRef instance

if (customField != null)
{
     DateCustomFieldRef dateField = customField;
     if (dateField.internalId != null && dateField.internalId == "created_date")
     {
           createdDate = dateField.value.ToString();
     }
}
else
{
    var stringField = customFields[f] as StringCustomFieldRef;
    if (stringField != null )
    {
        StringCustomFieldRef tradingNameField = stringField;
        if (businessNameField.internalId != null && businessNameField.internalId == "business_name")
        {
            businessName = businessNameField.value;
        }
    }
}

但是,我相信可能存在一个更好的解决方案(尽管我不知道您的项目,也不知道您的代码),但是是否有可能抽象一些东西呢?

也许您有一个CustomField基类,并且DateCustomFieldRefStringCustomFieldRef继承自该Customfield基类。 如果是这种情况,您可以在CustomField基类中创建一个虚拟(甚至可能是抽象的)方法,该方法在每个子类中均会被覆盖,实际上将返回该字段的值。

像这样:

public class CustomField<T>
{

    public string Internalid
    {
        get;
        set;
    }

    public T Value
    { 
        get;
        set;
    }

    public virtual string GetStringRepresentation()
    {
        return Value.ToString();
    }
}

public class DateCustomField : CustomField<DateTime>
{
    public override string GetStringRepresentation()
    {
         return Value.ToShortDateString();
    }
}

然后,您的代码可以看起来更加简单:

foreach( CustomField f in customFields )
{
     if( f.InternalId == "created_date" )
     {
         createdDate = f.GetStringRepresentation();
     }
     if( f.InternalId == "business_name" )
     {
         businessName = f.GetStringRepresentation();
     }
}

(可以使上面的代码更简单,更简洁,但是您会逐渐感到困惑。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM