2011-04-01 57 views
1

我有我知道不是最佳的代碼。我跑了代碼分析,它給了我警告VS2010代碼分析和CA1800:微軟性能

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

有人請給我一個代碼示例或進一步解釋它的真正含義嗎?

在此先感謝。

回答

4

的問題是在這樣的代碼:

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

這些多個轉換。

更好:

DateCustomFieldRef fieldasDate = customField as DateCustomFieldFRef 

if (fieldasDate != null) 
{ 
    blablabla using fieldasdate 

這就避免了多次轉換。

2

這意味着你正在鑄造(這可能是昂貴的)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(); 
    } 
} 

(上面還可以更爲簡單幹淨,但你會得到漂移的代碼。 )