什么是铸造参数的成本

时间:2012-03-07 15:01:14

标签: c# casting

当使用MVVM和Prism时,我发现自己进行了大量的转换,因为大多数参数都是接口

实施例

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

我的问题是,涉及的费用是多少。如果避免这些操作,这些操作是否会耗费大量内存或cpu。

任何观点?

3 个答案:

答案 0 :(得分:7)

我认为更重要的问题是你为什么要做这么多的演员?

在第一个例子中:
如果您继续将其投放到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 :(得分:1)

使用

       ((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); 

答案 2 :(得分:0)

这篇文章可能会说明施法如何影响表现

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

  

以下是一些基于优化程序的一般提示   在前几节中获得的结果:

     
      
  • 数字类型转换通常很昂贵,将它们从循环和递归函数中取出并在使用相同的数字类型时   可能。

  •   
  • 向下转发是一项伟大的发明,但涉及的类型检查对执行性能有很大影响,请检查对象类型   循环和递归函数,并使用“as”运算符。

  •   
  • 上传很便宜!在任何需要的地方使用它。

  •   
  • 构建轻量级转换运算符以更快地进行自定义转换。使用的工具
  •