gpt4 book ai didi

c# - 类型转换参数的成本是多少

转载 作者:太空狗 更新时间:2023-10-29 20:17:52 24 4
gpt4 key购买 nike

在使用 MVVM 和 Prism 时,我发现自己做了很多转换,因为大多数参数都是接口(interface)

  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 资源,是否应该避免。

有意见吗?

最佳答案

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

在第一个例子中:
为什么第一个参数类型是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 上调用方法

使用泛型。如果您需要类型特定的逻辑,请使用通用参数创建一个抽象基类(或者如果您不需要任何共享逻辑,则只是一个接口(interface))。然后为接口(interface)的每个实现实现该类。方法也可以是通用的。我可以将第二个示例重写为

public void DeletePart<TPlantItem>(TPlantItem plantItem)
where TPlantItem : IPlantItem
{
IEnumerable<TPlantItem> itmParent = GetParentPartByObjectId(_siteDocument, plantItem);
((ObservableCollection<TPlantItem>)itmParent).Remove(plantItem);
}

关于c# - 类型转换参数的成本是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9603831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com