这是铸造的低效使用吗?

时间:2008-12-20 23:51:55

标签: .net casting

这个问题是previous question i asked的扩展(已被回答)。我正在重构我的代码,并尝试使用各种重构的解决方案。

我提出的解决方案之一(但不满意......记住,我只是尝试一些个人编码风格)wsa代码如下: -

if (data is ITagElement)
{
    if (((ITagElement) data).TagList.IsNullOrEmpty())
    {
        ((ITagElement) data).TagList = new List<Tag>();
    }

    ((ITagElement) data).TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
         V = xmlReader.GetAttribute("v")
    });
}

请注意我是如何将父对象data强制转换为多次触发的接口类型?代码有效,但我觉得这是代码味道 - &gt;这不是很有效率。我觉得这可以改进 - 来自任何一个大师的想法吗?

3 个答案:

答案 0 :(得分:11)

这个怎么样,所以你只做一次演员:

ITagElement someData = data as ITagElement
if (someData != null)
{
   if (someData.TagList.IsNullOrEmpty())
    {
        someData.TagList = new List<Tag>();
    }

    someData.TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
         V = xmlReader.GetAttribute("v")
    });

}

答案 1 :(得分:3)

使用as operator获取并投射相同的操作:

ITagElement tagElement = data as ITagElement;
if (tagElement == null) return;

if (tagElement.TagList.IsNullOrEmpty()) {
   tagElement.TagList = new List<Tag>();
}

tagElement.TagList.Add(new Tag
{
    K = xmlReader.GetAttribute("k"),
    V = xmlReader.GetAttribute("v")
});

答案 2 :(得分:2)

我认为这样会更清楚:

if (data is ITagElement)
{
    ITagElement dataAsTagElement = (ITagElement)data;
    if (dataAsTagElement.TagList.IsNullOrEmpty())
    {
        dataAsTagElement.TagList = new List<Tag>();
    }

    dataAsTagElement.TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
        V = xmlReader.GetAttribute("v")
    });
}

这会更好,因为它会避免使用3次投射以换取指针。它的眼睛也更容易了!