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