2016-07-14 35 views
1

Ich wollte eine .ToList() Erweiterungsmethode für das Objekt Recipients für Outlook machen, aber ich war mir nicht sicher, ob es eine gute Übung ist. Würde es einen zusätzlichen Verweis auf das Objekt erstellen, das aufgeräumt werden müsste, oder wäre es in Ordnung, solange ich das ursprüngliche Recipients Objekt bereinige? Die Erweiterung würde in etwa so verwendet werden.Sind Erweiterungsmethoden für COM-Objekte fehlerhaft?

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

Ist 'OutlookEx.ReleaseComObject' gehen schließlich zu nennen' Marshal.ReleaseComObject' oder 'Marshal.FinalReleaseComObject'? – acelent

+0

Ja, es ist nur eine statische Methode, die 'Marshal.ReleaseComObject (o)' und 'o = null' aufruft. – Natzely

+0

Ok, das habe ich vermutet. Bitte recherchiere darüber und sei sehr vorsichtig. ** Wenn du zum Beispiel andere Referenzen hast, sogar nur einen, zu einem "Empfänger", den du so frei machst, wirst du RCW-Ausnahmen bekommen. Meistens sind Sie besser mit erzwungenen Speicherbereinigungen ausgestattet. – acelent

Antwort

4

Extensions Methoden sind nur statische Methoden

Erstellen von Erweiterungen Methoden erstellt werden, keine zusätzliche Referenz dazu führen, Erweiterungsmethoden syntaktischer Zucker für statische Methoden sind, sind sie statische Methoden nach wie vor aber nur erlauben Ihnen, sie zu nennen auf eine benutzerfreundlichere Art und Weise.

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

Sie müssen noch Ihre COM-Objekte bereinigen, richtig

Das heißt, Sie müssen noch bereinigen und nicht verwalteten Ressourcen verwalten korrekt innerhalb einer statischen Methode zu sein, sollten nicht anders behandelt werden als wenn Sie die Methode wurden die Umsetzung anderswo

1

Eine Erweiterungsmethode ist, kostenmäßig, nicht anders als eine Instanzmethode. Eine Instanzmethode hat einen versteckten Parameter, der auf self verweist, die Instanzmethode hat dasselbe Konzept, nur ist sie für den Entwickler nicht verborgen. Die Anruflisten sehen gleich aus und der Speicherdruck ist derselbe.

Mit anderen Worten, wenn Sie es für angemessen halten, eine Funktion zu verwenden, gibt es keinen Grund (außer Stil und Wiederverwertbarkeit) es eine Erweiterungsmethode zu machen.

1

Würde es einen zusätzlichen Verweis auf das Objekt erstellen, das aufgeräumt werden müsste, oder wäre es in Ordnung, solange ich das ursprüngliche Objekt Recipients bereinige?

Nein - Erweiterungsmethoden sind nur statische Methoden, die auf andere Weise aufgerufen werden können. Solange Sie den Parameter recipients nicht irgendwo speichern, wird er den Gültigkeitsbereich verlassen, sobald die Methode abgeschlossen ist und nicht "bereinigt" werden muss. Aber das wäre nicht anders, wenn es sich um eine statische Nicht-Erweiterungsmethode oder eine Instanzmethode handeln würde.