Анализ кода VS2010 и CA1800: производительность Microsoft - PullRequest
1 голос
/ 01 апреля 2011

У меня есть код ниже, который я знаю, не является оптимальным.Я запустил Анализ кода, и он дал мне предупреждение

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;
                    }
                }
        }
}

Может кто-нибудь дать мне пример кода или объяснитьдалее, что это на самом деле означает?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 01 апреля 2011

Проблема в коде, подобном следующему:

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

Это несколько приведений.

Лучше:

DateCustomFieldRef fieldasDate = customField as DateCustomFieldFRef

if (fieldasDate != null)
{
  blablabla using fieldasdate

Это позволяет избежать многократных приведений.

2 голосов
/ 01 апреля 2011

Это означает, что вы разыгрываете (что может быть дорогостоящим) переменную customField несколько раз, и вам будет лучше, разыгрывая только один раз.

Вы можете использовать Оператор as для этого, поскольку оператор as выполняет приведение и возвращает экземпляр нужного типа, или NULL, если объект не может быть приведен к нужному типу.

Likethis:

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 базовый класс, а DateCustomFieldRef и StringCustomFieldRef наследуются от этого 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();
     }
}

(Код выше можно сделать более простым и чистым, но вы получите смещение.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...