当使用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。
任何观点?
答案 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”运算符。
上传很便宜!在任何需要的地方使用它。
- 构建轻量级转换运算符以更快地进行自定义转换。使用的工具