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
}
}
扩展方法只是静态方法
创建扩展方法不会导致创建额外的引用,扩展方法是静态方法的语法糖,它们仍然是静态方法,但只是允许您以更用户友好的方式调用它们。
var ls = Extensions.ToList(recipients)
//is equivalent to
var ls = recipients.ToList()
您仍然需要正确清理 COM 对象
话虽如此,您仍然需要在静态方法中正确清理和管理非托管资源,处理方式不应与在其他任何地方实现该方法有任何不同
在成本方面,扩展方法与实例方法没有什么不同。 实例方法有一个指向 self 的隐藏参数,实例方法具有相同的概念,只是它没有对开发人员隐藏。调用堆栈最终看起来相同,内存压力相同。
换句话说,如果您认为使用函数是合理的,则没有理由(除了样式和可重用性)使其成为扩展方法。
它会创建对需要清理的对象的额外引用,还是只要我清理原始收件人对象就可以了?
否 - 扩展方法只是静态方法,可以称为不同的方式。 只要您没有将recipients
参数存储在某处,一旦方法完成,它就会超出范围,并且不需要"清理"。 但如果它是静态非扩展方法或实例方法,则没有什么不同。