COM 对象上的扩展方法是否不正确

本文关键字:方法 是否 不正确 扩展 对象 COM | 更新日期: 2023-09-27 17:57:11

我想为 Outlook 的Recipients对象创建一个.ToList()扩展方法,但我不确定这是否是好的做法。它会创建对需要清理的对象的额外引用,还是只要我清理原始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
    }
}

COM 对象上的扩展方法是否不正确

扩展方法只是静态方法

创建扩展方法

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

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

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

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

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

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

它会创建对需要清理的对象的额外引用,还是只要我清理原始收件人对象就可以了?

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