COM对象上的扩展方法是否错误?

时间:2016-07-14 21:50:32

标签: c# com extension-methods outlook-addin

我想为Outlook的.ToList()对象制作Recipients扩展方法,但我不确定这是不是很好。是否会为需要清理的对象创建额外的引用,或者只要我清理原始的Recipients对象就可以了?扩展名将使用类似的内容。

private void Foo()
{
    Recipeints recipients = mailItem.Recipients //Original recipients
    if(recipients.ToList().Intersect(listOfRecipients).Any())
    { }
    OutlookEx.ReleaseComObject(ref recipients);
}

public static class Extensions
{
    public static List<string> ToList(this Outlook.Recipients recipients)
    {
        List<string> list= new List<string>();

        if(recipients == null)
            return null;

        for (int i = 1; i <= recipients.Count; i++)
        {
            Outlook.Recipient r = recipients[i];
            list.Add(r.Name);
            OutlookEx.ReleaseComObject(ref r);
        }

        return list
    }
}

3 个答案:

答案 0 :(得分:4)

扩展方法只是静态方法

创建扩展方法不会导致创建额外的引用,扩展方法对于静态方法是语法糖,它们仍然是静态方法,但只是允许您以更加用户友好的方式调用它们方式。

var ls = Extensions.ToList(recipients)
//is equivalent to 
var ls = recipients.ToList()

您仍然需要正确清理COM对象

话虽如此,你仍然需要在静态方法中正确地清理和管理非托管资源,不应该像在其他任何地方实现方法那样处理

答案 1 :(得分:1)

扩展方法在成本方面与实例方法没有区别。实例方法有一个指向self的隐藏参数,实例方法具有相同的概念,只有它不会隐藏给开发人员。调用堆栈最终看起来相同,内存压力相同。

换句话说,如果你认为使用函数是合理的,那么没有理由(除了样式和可重用性)使它成为一个扩展方法。

答案 2 :(得分:1)

  

它是否会为需要清理的对象创建一个额外的引用,或者只要我清理原始的Recipients对象就可以了吗?

不 - 扩展方法只是静态方法,可以用不同的方式调用。只要您没有在某处存储recipients参数,一旦方法完成,它就会超出范围,并且不需要“清理”。但如果它是静态非扩展方法或实例方法,则没有什么不同。