繁体   English   中英

COM对象的扩展方法不好吗?

[英]Are Extension Methods on COM objects bad?

我想为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
    }
}

扩展方法只是静态方法

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

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

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

话虽这么说,您仍然需要正确地清理和管理处于静态方法内部的非托管资源,与在其他任何地方实现该方法相比,处理方式应有所不同

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

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

它会为需要清除的对象创建一个额外的引用吗,或者只要我清除原始的收件人对象就可以了吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM