Какова стоимость параметров литья - PullRequest
7 голосов
/ 07 марта 2012

При работе с MVVM и Prism я часто выполняю кастинг, так как большинство параметров являются интерфейсами

Ex

  public void AddCrSubSystemsToPlant(IPlantItem plantItm, CRArticleItem crItm)
        {

            OSiteSubSystem itm = (OSiteSubSystem)crItm;
            itm.PartData.Order = ((OSiteEquipment)plantItm).SubSystems.Count() + 1;

            ((OSiteEquipment)plantItm).SubSystems.Add(itm);

        }

или

  public void DeletePart(IPlantItem plantItem)
        {
            IEnumerable<IPlantItem> itmParent = GetParentPartByObjectId(_siteDocument, plantItem);

            if (plantItem is OSiteEquipment)
            ((ObservableCollection<OSiteEquipment>)itmParent).Remove((OSiteEquipment)plantItem);

            if (plantItem is OSiteSubSystem)
                ((ObservableCollection<OSiteSubSystem>)itmParent).Remove((OSiteSubSystem)plantItem);

            if (plantItem is OSiteComponent)
                ((ObservableCollection<OSiteComponent>)itmParent).Remove((OSiteComponent)plantItem);
        }

Мой вопрос: сколько это стоит? Являются ли эти операции дорогостоящей памятью или процессором, если их следует избегать.

Есть какие-нибудь взгляды?

Ответы [ 3 ]

7 голосов
/ 07 марта 2012

Я думаю, что более важный вопрос - почему вы так много кастуете?

В первом примере:
Почему первый тип параметра IPlantItem, если вы продолжаете приводить его к OSiteEquipment? То же самое можно сказать и о втором параметре.

Во втором примере:
Почему GetParentPArtByObjectId возвращает IEnumerable<IPlantItem>? Если бы он вернул ICollection<IPlantItem>, вам не пришлось бы разыгрывать ObservableCollection<T>. ObservableCollection<T> наследуется от Collection<T>, который реализует как ICollection<T>, так и ICollection. Вы должны иметь возможность удалить предмет из коллекции, даже не зная его типа.

Теперь несколько советов.
Не применяйте один и тот же объект несколько раз.
Не делай этого:

if (obj is IPlantItem)
    ((IPlantItem)obj).DoSomething();

Сделайте это вместо

IPlantItem plant = obj as IPlantItem;
if (plant != null)
    plant.DoSomething();

Используйте базовые типы всякий раз, когда это возможно. Это избавит вас от необходимости кастовать так много. Как уже говорилось, не приводите к ObserableCollection<T> для вызова метода на ICollection

Используйте дженерики. Если вам нужна специфичная для типа логика, создайте абстрактный базовый класс (или просто интерфейс, если вам не нужна общая логика) с универсальным параметром. Затем создайте реализации этого класса для каждой из реализаций интерфейса. Методы тоже могут быть общими. Я могу переписать второй пример как

public void DeletePart<TPlantItem>(TPlantItem plantItem)
    where TPlantItem : IPlantItem
{
    IEnumerable<TPlantItem> itmParent = GetParentPartByObjectId(_siteDocument, plantItem);
    ((ObservableCollection<TPlantItem>)itmParent).Remove(plantItem);
}
1 голос
/ 07 марта 2012

использование

       ((System.Collections.IList)itmParent).Remove(plantItem);

вместо

        if (plantItem is OSiteEquipment) 
        ((ObservableCollection<OSiteEquipment>)itmParent).Remove((OSiteEquipment)plantItem); 

        if (plantItem is OSiteSubSystem) 
            ((ObservableCollection<OSiteSubSystem>)itmParent).Remove((OSiteSubSystem)plantItem); 

        if (plantItem is OSiteComponent) 
            ((ObservableCollection<OSiteComponent>)itmParent).Remove((OSiteComponent)plantItem); 
0 голосов
/ 07 марта 2012

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

http://www.codeproject.com/Articles/8052/Type-casting-impact-over-execution-performance-in

Вот несколько общих советов по оптимизации ваших программ на основе результатов, полученных в предыдущих разделах.:

  • Числовые преобразования типов, как правило, дороги, вынимают их из циклов и рекурсивных функций и используют те же числовые типы, когда это возможно.

  • Даункастинг - отличное изобретение, но связанные с ним проверки типов оказывают большое влияние на производительность выполнения, проверяют типы объектов из циклов и рекурсивных функций и используют в них оператор «как».,

  • Апкастинг дешевый! Используйте его везде, где вам нужно.

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