2011-04-01 2 views
1

나는 최적이 아니라는 것을 알고있는 아래 코드를 가지고 있습니다. 코드 분석을 실행했고 경고 메시지를 보냈습니다.VS2010 코드 분석 및 CA1800 : Microsoft 성능

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; 

:

답변

4

문제는 다음과 같은 코드입니다.

더 나은 :

DateCustomFieldRef fieldasDate = customField as DateCustomFieldFRef 

if (fieldasDate != null) 
{ 
    blablabla using fieldasdate 

이것은 여러 캐스트를 방지 할 수 있습니다.

2

즉, 변수를 여러 번 입력 (값 비싼 경우가 있음)하고 한 번만 캐스팅하는 것이 좋습니다.

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

을하지만, (I 프로젝트, 나 코드를 모르겠지만) 아마 더 나은 솔루션이 존재 함을 생각하지만, 그것은 추상적 일부 가능하지 않을 것 멀리 가지?

아마도 당신은 CustomField없는 baseclass 및 DateCustomFieldRefCustomfield의 base class에서 StringCustomFieldRef 상속 있습니다. 그렇다면 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(); 
    } 
} 

(코드 위보다 간단하고 깨끗하게 될 수 있지만, 당신은 드리프트를 얻을 수 있습니다.)